对于流星铁路由器中的this.response,'end'未定义

时间:2015-10-02 19:56:25

标签: meteor iron-router

我使用Iron Router为我的Meteor服务器创建了一个HTTP POST端点。我想使用状态和其他元数据的JSON向请求者发送响应。

以下是端点的代码:

.eml

Meteor控制台正在打印:

Router.route('/new_video', {where: 'server'})
.post(function(){

    var body = this.request.body;
    this.response.setHeader('Content-Type', 'application/json');

    var filename = body.filename;


    console.log('New video uploaded for: ' + filename);

    Meteor.call('newUpload', filename, function(error, results){
        if (error){
            throw new Meteor.Error("new-video-upload-failed", "New video could not be uploaded.");
            var message = {
                url: '/new_video',
                status: 'success'
            };
        }
        else{
            var videoId = results;
            console.log('Returned video id: ' + videoId);
            var message = {
                url: '/new_video',
                status: 'failure'
            };
        }

        this.response.end(JSON.stringify(message));
    });
});

1 个答案:

答案 0 :(得分:2)

这是JS的常见缺陷,由于在this中引入了另一个函数回调,因此修改了Meteor.call的值。

如果您使用的是ES2015箭头功能附带的Meteor 1.2,您可以使用此函数声明语法解决问题:

Meteor.call('newUpload', filename, (error, results) => {
  // here 'this' will keep referencing the POST route context
  // so you can safely use this.response
});

如果您不使用Meteor 1.2,请改用此语法:

Meteor.call('newUpload', filename, function(error, results) {
  // inner function is bound to parent function 'this'
}.bind(this));