我对 Node JS 和 Express 非常陌生,所以如果这个问题到处都是,我深表歉意。
在我的 route ,我在单独的模块中调用一个函数:
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 不是函数”。
我知道我需要以某种方式使用回调,但此时我完全迷失了。
最佳答案
将 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
函数返回一个 promise ,当您获得异步结果时,您将使用结果解析该 promise ,然后您的路由器可以使用该 promise 来获取结果。
关于node.js - 在路由文件之外使用 res.send(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40812399/