这就是我想要达到的目标。我想使用我开发的CRUD的READ操作,这意味着我必须调用HTTP请求(例如,使用RequestJS)。然后使用来自READ的响应来做其他一些事情。
读取操作
router.get('/api/example', function(request, response, next) {
//MongoDB Code to fetch a certain doc
exampleModel.find(request.query.key)
.then(function(doc) {response.status(200).json(doc)})
});
所以如您所见,我用json响应用户。我想要做的是使用此路由,并获取要在另一个函数中使用的JSON响应。某种意义上的中间件。
其他功能
function useRead(){
//Make an HTTP Request using localhost:3000/api/example?key=123
useJSON(doc)
}
我知道我可以使用requestJS来获取响应。但是问题是,向localhost:3000 / api / example?key = 123发出请求是否有意义。例如,当我在Heroku上部署该应用程序时,该URL就没有意义,并且我认为该应用程序将崩溃,因为它应使用www.myDomain.com而不是localhost:3000,所以如何解决此问题。>
我试图尽可能简洁,抱歉,如果不清楚。
答案 0 :(得分:0)
用Gonzalo详细说明,请移出api路由内的逻辑到函数,导出函数以在服务器中的任何地方使用。
示例:
//Page with read operation
module.exports = {
router : router,
exampleFunction : exampleFunction
}
router.get('/api/example', function(req, res){
exampleFunction(req.query, function(err, doc){
if(err)
console.log(err);
response.status(200).json(doc);
})
});
function exampleFunction(query, next) {
//MongoDB Code to fetch a certain doc
exampleModel.find(query.key)
.then(function(err,doc) {
if(err)
return next(err,null);
return next(null, doc);
})
}
//page with read call
var readPage = require('readPage');
function useRead(){
readPage.exampleFunction({query:{key:'abcd'}},function(err, doc){
if(err)
console.log(err);
useJSON(doc)
});
}
答案 1 :(得分:0)
您可能已经掌握了解决方案。假设您正在使用像react或angular这样的MV框架进行开发,或者仅使用简单的javascript进行开发,就可以使用相对路径调用API,前提是您要在同一express应用中使用express static渲染前端部分。
router.get('/api/example', function(req, res){
exampleFunction(req.query, function(err, doc){
if(err)
console.log(err);
response.status(200).json(doc);
})
});
因此,在Web应用程序内部,您可以按以下方式调用API。
app.js (或运行应用程序的任何其他文件)
app.use('/', express.static(__dirname + 'public')); // assuming static files are placed inside public folder
async function getAPI() {
try {
const res = await axios.post('/path/to/api'); // Doesn't require server remote url as it is relative
} catch (e) {
console.log(e);
}
}
现在前端可以像这样调用其自己的API。
额外提示(在路线内使用承诺通话)
...
const axios = require('axios'); // I am using axios. Use whatever you require
...
...
route.get('/path/to/api', (req, res) => {
try {
const res = await axios.get('/remote/api/);
res.send(res.data)
} catch (err) {
res.status(401).send(err.data);
}
});