我正在尝试简短。希望它不是那么简短,没有任何意义。我需要从API读取标识符列表,该标识符将用于随后“获取”与列表中的键关联的JSON文件。列表数组存储在同一端点的另一个JSON文件中,标识符为“ keys.json”。为了防止列表被处理两次,我想在检索后立即将一个空数组写回到“ keys.json”它。
这是“获取”列表的成功函数。
const getJsonKeys = async () => {
const options = {
method: 'GET',
uri: baseURL + keysID,
headers: { 'User-Agent': 'Request-Promise' },
json: true // Automatically parses the JSON string in the response
};
return (await rpn(options)).keys;
};
这是我尝试使用的不成功的“ POST”:
const postEmptyJsonKeys = async () => {
const options = {
method: 'POST',
uri: baseURL + keysID,
body: {
keys: []
},
json: true // Automatically stringifies the body to JSON
};
return (await rpn(options)).req.Request.body;
};
这是同时调用它们的块:
module.exports = (rtProcess) => {
rtProcess.get('/process', async (req, res, next) => {
const jsonKeysList = await (getJsonKeys());
console.log("Retrieved Keys", jsonKeysList);
try {
const req = await (postEmptyJsonKeys());
console.log("Wrote", req.Request.body);
} catch(err) {
console.log(err.statusCode, err.error);
console.log(err);
}
//
// more code here
//
jsonKeysList.forEach(courseID => {
//
// more code here
//
});
res.render("process");
}); // end of process route
}; // end of module exports
我已经尽我所能做的所有事情来找出周围各种文档中的答案,但是我找不到任何能告诉我为什么采用catch块的方法,而不是成功尝试。
顺便说一句,错误。状态代码是404。
错误是一个看起来像HTML的字符串,这对我来说也是个谜,因为我试图发布一个简单的帖子:
{
keys: []
}
答案 0 :(得分:0)
所以这个错误:
Cannot POST /static/quizdata/keys.json
让我认为您要发布的API端点定义不正确,这就是为什么您得到404
的原因,它告诉您没有POST
处理程序与该请求匹配。
由于该问题带有node.js
标记,并且我可以在URL中看到static
部分,所以我认为您可能正在使用express.static
built-in middleware提供该静态内容,如果那么,这就是为什么您不能POST
在那儿的任何原因,因为该中间件并非用于此目的,而只能处理GET
个请求。
关于您的评论,它不是静态内容,因为该路由中包含static
,或者该内容位于名为static
的目录中(如果是这种情况)。
看看这个例子:
这将处理GET
之类的http.../static/path/inside/public/dir.png
个请求:
app.use('/static', express.static('public'));
这将处理GET
之类的http.../assets/path/inside/public/dir.png
个请求:
app.use('/assets', express.static('public'));
这将处理GET
之类的http.../whatever/something/inside/public/dir.png
个请求:
app.use('/whatever', express.static('public'));
这将处理GET
之类的http.../something/inside/public/dir.png
个请求:
app.use(express.static('public'));
这将处理GET
之类的http.../something/inside/my-static-files/dir.png
个请求:
app.use(express.static('my-static-files'));
您可以在official docs中找到更多示例。
无论如何,我们假设您使用此选项提供静态内容:
app.use('/static', express.static('public'));
您仍然可以添加另一个中间件来处理POST
请求。像这样:
const express = require('express');
const fs = require('fs');
const app = express();
const port = 3000;
...
app.post('/static', (req, res, next) => {
// Just an example, you can replace the path and the []
// with anything you want:
fs.writeFileSync('path/to/file.json', JSON.stringify([]));
});
app.use('/static', express.static('public'));
app.listen(port, () => console.log(`Listening on port ${port}!`));
您可能还会发现其他有用的问题:Appending a JSON file from JS file in Express Application