无法确定为什么在“带有404的POST”上请求承诺失败的原因

时间:2018-11-06 02:26:35

标签: node.js json npm request-promise

我正在尝试简短。希望它不是那么简短,没有任何意义。我需要从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: []
}

1 个答案:

答案 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