在Routes文件之外使用res.send()

时间:2016-11-25 21:19:36

标签: node.js express

我是Node JS和Express的新手,所以如果这个问题到处都是道歉。

在我的一个路线中,我在一个单独的模块中调用一个函数:

var express = require('express');
var router = express.Router();
var imgur = require('../helpers/imgur.js');

router.get('/imagesearch/:query', function(req, res) {

    imgur.search('cats', '2');

});

module.exports = router;

Imgur助手文件目前看起来像这样:

const https = require('https');

module.exports = {
    search : function(query, pagination) {
        var options = {
            host: 'api.imgur.com',
            path: '/3/gallery/search/hot/' + pagination + '?q=' + query,
            port: 443,
            method: 'GET',
            headers: {'Authorization' : 'Client-ID ' + process.env.API_KEY}
        };

        var callback = function(res) {
            var str = '';

            res.on('data', function(chunk) {
                str += chunk;
            });

            res.on('end', function() {
                var result = JSON.parse(str);
                result = result.data;

                var finalResult = [];

                for(var key in result) {
                    url = result[key].link;
                    title = result[key].title;
                    points = result[key].points;

                    var temp = {url: url, title: title, points: points};

                    finalResult.push(temp);
                }

                return finalResult;
            });
        };

        var req = https.request(options, callback);

        req.end();

        req.on('error', function(e) {
            console.error(e);
        });
    }
};

目的是将finalResult变量转换为JSON并通过res.send提供它,就像API一样。

正如您所看到的,我尝试从函数返回数据,但我认为与Node的工作原理并不一致。我尝试过使用res.send甚至res.render,但这两个都返回“X不是函数”。

我知道我需要以某种方式使用回调,但此时我完全迷失了。

2 个答案:

答案 0 :(得分:1)

res对象传递到search函数,然后您可以在该函数中调用res.send()

将其声明为参数:

search : function(res, query, pagination) {

传递给:

router.get('/imagesearch/:query', function(req, res) {
    imgur.search(res, 'cats', '2');
});

然后,在search功能的实施过程中,您可以随时拨打res.send(...)

或者,您可以让search函数返回一个承诺,当您获得异步结果时,您将使用结果解析该承诺,然后您的路由器可以使用该承诺来获取结果。

答案 1 :(得分:1)

以一种很好的方式做到这一点的两种方法。您应该在调用函数时处理响应,而不是像某些人建议的那样将其传递给搜索:

1。发送回调到搜索

imgur.search('cats', '2', function (data) {
    res.send(data) // call callback with data and send or whatever you want
});

然后在搜索中:

function search(query, pagination, cb) {
    // Do stuff
    cb(null, data);
}

2。使用承诺

imgur
    .search('cats', 2)
    .then(function (data) {
        res.send(data) // Or whatever
    })

要做2.您需要从搜索功能返回一个承诺(我的例子是使用蓝鸟)

var Promise = require('bluebird');
function search(query, pagination) {
    return new Promise(function (resolve, reject) {
        // Do stuff
        return resolve(data);
    }
}