首页 > 解决方案 > 无法确定为什么 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: []
}

标签: node.jsjsonnpmrequest-promise

解决方案


所以这个错误:

Cannot POST /static/quizdata/keys.json

让我认为您发布到的 API 端点没有正确定义,这就是为什么您得到一个404它告诉您没有POST与该请求匹配的处理程序。

由于问题有node.js标签,我可以看到staticURL 中的部分,这让我认为您可能正在使用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


推荐阅读