app.get - res.send vs return res.send之间有什么区别

时间:2017-03-27 20:11:21

标签: node.js express

我是节点和表达新手。我已经看到了使用“res.send”和“return res.send”的app.get和app.post示例。这些都一样吗?

var express = require('express');
var app = express();

app.get('/', function(req, res) {
  res.type('text/plain');
  res.send('i am a beautiful butterfly');
});

var express = require('express');
var app = express();

app.get('/', function(req, res) {
  res.type('text/plain');
  return res.send('i am a beautiful butterfly');
});

3 个答案:

答案 0 :(得分:17)

return关键字从函数返回,从而结束执行。这意味着它之后的任何代码行都不会被执行。

在某些情况下,您可能希望使用res.send然后执行其他操作。

app.get('/', function(req, res) {
  res.send('i am a beautiful butterfly');
  console.log("this gets executed");
});

app.get('/', function(req, res) {
  return res.send('i am a beautiful butterfly');
  console.log("this does NOT get executed");
});

答案 1 :(得分:7)

我想指出它在我的代码中确实起到了作用。

我有一个对令牌进行身份验证的中间件。代码如下:

function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1] || null;

  if(token === null) return res.sendStatus(401); // MARKED 1
  jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
    if(err) return res.sendStatus(403); // MARKED 2
    req.user = user;
    next();
  });
}

// MARKED 1行中,如果我没有写return,则中间件将继续执行并调用next()并发出状态为200的响应,这不是预期的行为

// MARKED 2

也是如此

如果您没有在这些return块中使用if,请确保使用的是else被调用的next()块。

希望这有助于从一开始就理解概念并避免错误。

答案 2 :(得分:1)

app.get('/', function(req, res) {
    res.type('text/plain');
    if (someTruthyConditinal) {
        return res.send(':)');
    }
    // The execution will never get here
    console.log('Some error might be happening :(');
});

app.get('/', function(req, res) {
    res.type('text/plain');
    if (someTruthyConditinal) {
        res.send(':)');
    }
    // The execution will get here
    console.log('Some error might be happening :(');
});