优化 Node.js 中的 API 请求

Posted

技术标签:

【中文标题】优化 Node.js 中的 API 请求【英文标题】:Optimize API requests in Node.js 【发布时间】:2017-10-24 13:22:28 【问题描述】:

我在 Node.js 中有一个 API。我的路线看起来像

exports.getUserList = (req, res, next) => 
  User.find().sort( name: 1 ).then(users => 
    res.json(
      status: 'success',
      users
    );
  ).catch(next);
;

如示例中所示,我使用.catch(next)。但这是正确的方法吗?路由不应该总是打印json吗?

所以我正在考虑做类似的事情

exports.getUserList = (req, res, next) => 
  User.find().sort( name: 1 ).then(users => 
    res.json(
      status: 'success',
      users
    );
  ).catch(err => 
    res.json(
      status: 'error',
      msg: err
    );
  );
;

但它不应该是 res.status(some_status_code).json() 之类的吗?

一个简单的 API 通常在错误处理方面是如何执行的?

如果我在代码中使用未定义的变量(即导致语法错误)怎么办?我应该用 JSON 错误来处理它,还是应该确保我不做草率的编码? :-D

另外,这是打印 json 的最快方法吗?我的意思是,我应该使用User.find().lean() 吗?我应该做一些缓存吗?将我的 API 存储在普通网站上是否更聪明,或者是否有针对这种情况优化的 API 服务器?

【问题讨论】:

你问了很多好问题。但这都是偏好问题。我做什么:在捕获中,我检查它是什么类型的错误,基于此,如果我无法弄清楚错误是什么,我要么返回404400401,要么返回500原因是。如果您想将JSON 连同您的错误代码一起返回,由您决定。当出现错误时,我通常会返回no-content。打印JSON 的最快方法:不知道,但这是您使用Express 的方式。关于缓存和优化,我总是想到“过早的优化是万恶之源”这句话。试着先让它工作。 这是来自官方ExpressJS 网站的精彩页面,其中包含他们对您的一些问题的建议:expressjs.com/en/advanced/best-practice-performance.html status:'error' 不会添加任何内容,除非您拒绝发送准确的 HTTP 错误代码。 HTTP API 设计中一个非常常见的错误是在交换格式中复制 HTTP 的子集。如果您无论如何都在 HTTP 之上构建,那么利用它提供的功能,并且只为 HTTP 无法表达的东西发明模式! 【参考方案1】:

您是否尝试过异步/等待功能以及成功和错误的自定义响应? 这里的例子:

responseHandler.js

// use this for success
function successResponse(message, data) 
  const success = 
    success: true,
    message: message,
    data: data
  
  return success


// use this as middleware error handler
function errorResponse(err,req,res,next) => 
  return res.status(err.status || 500).json(
    success: false,
    message: err.message
  )


module.exports = 
  successResponse,
  errorResponse

myRouter.js

const  successResponse  = require('./responseHandler')

exports.getUserList = async (req, res, next) => 
  await User.find().sort( name: 1 ).then(users => 
    res.status(200).json(
      successResponse(`data user`, users)
    )
  ).catch(err => 
    return err
  );
;

【讨论】:

以上是关于优化 Node.js 中的 API 请求的主要内容,如果未能解决你的问题,请参考以下文章

反应 js:axios 向 node.js api 发布请求

与浏览器相比,通过 Node.js 的 HTTP 请求延迟

Node.JS 中的 HTTP DELETE 动词

Node.js 应用程序从 GET 请求到 API 接收到空响应

向 Gmail API 发送消息的 Node.js POST 请求

Node-异步编程