node.js - 无法确定为什么 request-promise-native 在 'POST with a 404' 上失败
问题描述
我试图把这个简短。希望它不是那么简短以至于没有任何意义。我需要从 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 块,而不是成功尝试。
顺便说一句,error.status 代码是 404。
错误是一个看起来像 HTML 的字符串,这对我来说也是一个谜,因为我试图发布一个简单的:
{
keys: []
}
解决方案
所以这个错误:
Cannot POST /static/quizdata/keys.json
让我认为您发布到的 API 端点没有正确定义,这就是为什么您得到一个404
它告诉您没有POST
与该请求匹配的处理程序。
由于问题有node.js
标签,我可以看到static
URL 中的部分,这让我认为您可能正在使用express.static
内置的中间件提供静态内容,如果是这种情况,那么这就是为什么您不能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'));
您可以在官方文档中找到更多示例。
在任何情况下,假设您使用此选项提供静态内容:
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
推荐阅读
- unity3d - “GameObject”不包含“Play”的定义(您是否缺少 using 指令或程序集引用?)
- wordpress - 如何让我的 wordpress 网站能够让用户下载和上传文件?
- c++ - C2011: 'Card': 'class' 类型重新定义(尽管在 .cpp 文件中使用了包含保护而不是重新定义类)
- python - 带有视图状态的 Scrapy 递归抓取顺序
- java - 尝试将 Java 与 SQL Server Express 连接时出现问题
- java - 每次我在 JSF 项目中进行更改时,都需要更新 serialVersionUID
- c# - 失败:Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery
- sql - 跨 3 个表的多个记录的特定字符串的顺序查找并按最新条目显示
- flutter - 如何通过 CDN 在 Flutter 中添加图像
- android - Firebase AuthUI 未调用 onActivityResult