1

express在 Node 中使用来创建一个简单的 Web 应用程序。代码如下所示:

var get_stuff = function (callback) {
    another.getter(args, function (err, data) {
        if (err) throw err;

        data = do_stuff_to(data);

        callback(data);
    });
};

app.get('/endpoint', function (req, res) {
    get_stuff(res.send);
});

但是,当我运行它时,我得到了这个错误:TypeError: Cannot read property 'method' of undefined at res.send. 正在破坏的快速代码是这样开始的:

res.send = function (body) {
    var req = this.req;
    var head = 'HEAD' == req.method;

在我看来,我构建回调的方式thissend方法中丢失了。但我不知道如何解决它。有小费吗?谢谢!

4

2 回答 2

3

致电.bind

get_stuff(res.send.bind(res));

并查看MDN 文档this,了解它是如何工作的。的值this取决于函数的调用方式将其称为“正常”(回调可能会发生什么),例如

func();

将设置this为全局对象。仅当函数作为对象方法调用时(或者如果this显式设置为.bind,.apply或被.call使用),this则引用该对象:

obj.fun(); // `this` refers to `obj` inside the function

.bind允许您在this不调用函数的情况下指定值。它只是返回一个新函数,类似于

function bind(func, this_obj) {
    return function() {
        func.apply(this_obj, arguments);
    };
}
于 2013-08-11T20:45:51.733 回答
0

在 JavaScript 中, 的值this通常由调用站点决定,与 Python 不同的是,通过.运算符访问方法不会将其左侧绑定到this稍后调用该方法的时间。

要执行绑定,您可以.bind像在旧答案中一样调用,或者您可以手动执行绑定,将方法调用包装在另一个回调中:

get_stuff(function () {
    return res.send.apply(res, arguments);
});

从 ECMAScript 2018 开始,还可以使用粗箭头函数语法和剩余参数来使上述内容更加紧凑:

get_stuff((...args) => res.send(...args));
于 2022-01-05T20:03:04.687 回答