【问题标题】:NodeJS, Is it a bad practise to return res.jsonNodeJS,返回 res.json 是不是一种不好的做法
【发布时间】:2014-04-07 01:14:57
【问题描述】:

我正在使用 NodeJS 构建一个 ExpressJS 应用程序。我的问题是如果我这样做会有任何性能差异

app.get('/test', function(req, res) {
    fn(function(err, data) {
        if (err) {
            return res.json(400, {
                error: 1,
                msg: "some error"
            });
        }

        ///more code
    });
});

而不是

app.get('/test', function(req, res) {
    fn(function(err, data) {
        if (err) {
            res.json(400, {
                error: 1,
                msg: "some error"
            });
            return;
        }

        ///more code
    });
});

返回res 变量会增加服务器的负载。两个代码都有效,只是第一个看起来更好,我节省了 1 行。

【问题讨论】:

  • 我总是养成这样返回的习惯,这样我就不太可能对下面可能运行的代码感到惊讶。

标签: node.js express


【解决方案1】:

相反,我想很多人会告诉你这种成语是一种非常合理的做法,因为它让读者(通常是你未来的自己)清楚地知道你正在退出)。在这种特殊情况下,该策略的优点在于您可以节省更多代码,因为您现在在条件分支中只有一条语句,这意味着您可能会丢失一些花括号。

app.get('/test', function(req, res) {
    fn(function(err, data) {
        if (err)  return res.json(400, {
                    error: 1,
                    msg: "some error"
                 });
    ///more code
    });
});

但您问是否存在性能差异。如果有,我认为这几乎是难以察觉的。

【讨论】:

  • 不推荐使用符号 res.json(status, obj)。请改用 res.status(status).json(obj)。
【解决方案2】:

在函数中返回对象不会产生额外的负载。

【讨论】:

    【解决方案3】:

    在您的示例中,基于回调函数,没有区别。 但是如果 app.get 返回一个 Promise 呢?

    此代码将提供未处理的拒绝错误

    app.get('/test')
    .then( (data) => 
    { /* do something with your data that can throw a functional error 
    for exemple request for a user on your database based on your data */ 
      if (!user) res.json(401, {msg: 'USER NOT FOUND'});
      if (user.someProperty) //will throw an error when user is not found
       res.json(200, {msg: 'USER DID IT'});
    })
    .catch( (err) => {
      res.json(500, {msg: 'OUTCH'});
      throw(err);
    });
    

    这段代码不会

    app.get('/test')
    .then( (data) => 
    { /* do something with your data that can throw a functional error 
    for exemple request for a user on your database based on your data */ 
      if (!user) return res.json(401, {msg: 'USER NOT FOUND'});
      if (user.someProperty) //will not be evaluate when user is not found
       return res.json(200, {msg: 'USER DID IT'});
    })
    .catch( (err) => {
      res.json(500, {msg: 'OUTCH'});
      throw(err);
    });
    

    当使用 promise 时总是返回 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      相关资源
      最近更新 更多