这样写是可以正常调用的
router.route('/account')
.get(function (req, res, next) {
User.find()
.then(users => res.json(users))
.catch(err => next(err));
});
我觉得这段代码可以简化成
router.route('/account')
.get(function (req, res, next) {
User.find()
.then(res.json)
.catch(next);
});
可是采用第二种写法的时候在express的源码中会报错
res.json = function json(obj) {
var val = obj;
// allow status / body
if (arguments.length === 2) {
// res.json(body, status) backwards compat
if (typeof arguments[1] === 'number') {
deprecate('res.json(obj, status): Use res.status(status).json(obj) instead');
this.statusCode = arguments[1];
} else {
deprecate('res.json(status, obj): Use res.status(status).json(obj) instead');
this.statusCode = arguments[0];
val = arguments[1];
}
}
// settings
var app = this.app;
var replacer = app.get('json replacer');
var spaces = app.get('json spaces');
var body = JSON.stringify(val, replacer, spaces);
// content-type
if (!this.get('Content-Type')) {
this.set('Content-Type', 'application/json');
}
return this.send(body);
};
就是在
var app = this.app;
这一行,debug发现this值是undefined,在js里面,对象的方法,this不是应该直接指向该对象吗?为什么这里this也就是res会是undefined呢?
这两句不是等价的。。。。
then 函数的实现大概是这样的
所以其实二种写法分别是:
这两种调用方式,在
json
函数里 this 的值是不同的。详见我的博客吧
http://zonxin.github.io/post/...