我有一个API接收请求并进行一些查询和验证。
我想在findUserPlayer
函数中使用路由中的response
引用,这样我就可以向客户端发送一些内容。findUser
函数将返回一个将在findUserPlayer
上使用的data
对象。
var api = express.Router();
api.post('/signup', function (request, response) {
UserModel.find(req.body)
.then(findUser, createUser)
.then(findUserPlayer, createUserPlayer);
});
var findUserPlayer = function (data, res) {
//...
res.json(object);
};
- 我试过调用
findUserPlayer(data, res)
,它给了我"数据未定义" - 我已尝试调用
findUserPlayer(res)
,它将覆盖data
如何在回调中使用response
对象?
您可以定义一个成功处理程序函数,然后调用findUserPlayer,而不是直接传递findUserPlayer函数作为成功处理程序。
var api = express.Router();
api.post('/signup', function (request, response) {
UserModel.find(req.body)
.then(findUser, createUser)
.then(function(data) {
return findUserPlayer(data, response);
}, createUserPlayer);
});
var findUserPlayer = function (data, res) {
//...
res.json(object);
};
JavaScript是一种非常灵活的语言,这意味着有很多方法可以处理这一问题,最简单的方法之一(就最小代码更改而言)是颠倒findUserPlayer
中参数的顺序并绑定上下文(.bind(response)
)。
但这将是一个糟糕的设计选择。一个"查找用户"的函数没有理由处理响应或json。它超出了这个职能范围和职责。请求处理程序应该处理格式化相关响应的问题,我会通过返回promise链中的相关数据来实现这一点,最终:
.then(function(data) {
response.json(data);
});
我是lodash的忠实粉丝,有时也会出错,但我想我会使用lodash中的partialRight函数添加以下内容。
var _ = require('lodash');
...
UserModel.find(req.body)
.then(findUser, createUser)
.then(_.partialRight(findUserPlayer, response), createUserPlayer);
CCD_ 12返回一个新函数。_.partialRight
的第一个参数是我们要将参数附加到的函数。随后的参数是我们想要附加到函数的参数。
我假设以下函数签名:findUserPlayer(data, response)
。CCD_ 15将响应对象附加到新函数中。新的函数签名现在看起来是这样的:function (data)
。
文档