【问题标题】:Retrieving POST data in Node.js with Express使用 Express 在 Node.js 中检索 POST 数据
【发布时间】:2018-01-09 16:11:47
【问题描述】:

作为免责声明:我在这里阅读了很多关于这个主题的问题,它们听起来都很相似,但没有一个能帮助我解决我的问题,所以我决定发布我自己的问题。

我正在使用 ReactJS 作为前端并使用 node.js 和 express 作为后端。我的 ReactJS 应用程序中有以下表单:

handleFormSubmit (event) {
    event.preventDefault();

    var data = {
        entries : this.state.entry
    };

    $.ajax({
        type:"POST",
        url: "/todos",
        data: data,
        cache: false,
        success: function(data) {
            console.log("success");
        },
        error: function(xhr, status, err) {
            console.log("Sorry, there has been an error. Could not send data." + JSON.stringify(data));
        }
    });
}

render() {
    return (
      <div className="App">
        <form onSubmit={this.handleFormSubmit} enctype="multipart/form-data">
            <input onChange={this.handleChange} value={this.state.value}></input>
            <button type="submit">Submit List</button>
        </form>
        <button type="button" onClick={this.handleAdd}>Add</button>
    <ul>
    {this.state.entry.map((data, n) => 
            <li key={"this"+data} id={n}>{this.state.entry[n]}></li>
        )
    }
    </ul>
  </div>
);

}

旁注:/todos 是我的应用程序路由器文件夹中的一个文件,我通过http://localhost:8001/todos 访问它。 create-react-app 在端口 3000 上运行。(不确定它是否与这个问题相关,因此我会保持简短。我按照本教程https://www.fullstackreact.com/articles/using-create-react-app-with-a-server/ 将我的反应前端与我的节点/快递连接起来-结束)。

这就是我目前尝试检索节点中数据的方式(在我的 app.js 文件中):

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.get('/todos/:entries', function (req, res, next) {
    Todo.findById(req.params.entries, function(err, todo) {
        if(err) res.send(err);
        res.json(todo);
        console.log(todo);
    });
});

但这就是我的地方,有点困惑。显然它不起作用,或者至少我没有收到我认为应该的 console.log 消息。此外,在我的表单中,我将 todos.js 文件指定为应该接收数据的文件,但我看到的所有答案都使用了app.post()。他们是在 app.js/server.js 文件中还是在路由文件中使用它?如果是这样,那究竟是如何工作的?以及如何使用路由文件中的数据?为什么我这样做的方式不起作用? (如果您需要更多信息来回答这个问题,请告诉我)

编辑:

在 app.js 中:

var todos = require('./routes/todos');
app.use('/todos', todos);

在 todos.js 中:

var express = require('express');
var router = express.Router();
router.get("/", function (req, res) {
    //didn't know how to retrieve the data here
});

【问题讨论】:

  • 我更新了上面的代码。实际上我昨天查看了文档,但我找不到我的主要问题(我不知道应该在哪里检索数据,因为我认为它应该是我在我的ajax 请求)被提及。

标签: node.js reactjs express post


【解决方案1】:

你可以使用npm install axios这个包并参考这里https://www.npmjs.com/package/axios

在反应应用程序中,您可以使用此代码

import axios from 'axios';

axios.post('/user', data)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});

对于您的 Node express 应用,您可以使用

const express = require('express');
const app = express();
const bodyParser = require('body-parser');


app.use(bodyParser.urlencoded({extended: true}))

此代码用于从不同端口访问跨源错误

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers','Origin, X-Requested-With, 
  Content-Type, Accept, Authorization');
  if (req.method === 'OPTIONS') {
    res.header('Access-Control-Allow-Methods','PUT, POST, PATCH, 
    DELETE, GET');
    return res.status(200).json({});
}
   next();
})

然后你就可以使用你的代码了

app.get('/todos/:entries', function (req, res, next) {
Todo.findById(req.params.entries, function(err, todo) {
    if(err) res.send(err);
    res.json(todo);
    console.log(todo);
 });
});

【讨论】:

  • 非常感谢您的回复,还有一个问题:我是把node.js文件放在我的app.js文件还是todos.js中?
  • 好的,所以我只是在我的代码中实现了这个,但是,我不知道如何判断它是否真的有效。你知道我该如何测试吗?
  • 除了 Todo.findById(req.params.entries, function(err, todo) { 这段代码都应该放在 app.js 中
  • 我不太明白。我把最后一个函数(从 app.get('/todos:entries...) 开始放在 todos.js 中,但现在它告诉我应用程序未定义。你的意思是我只是把所有东西都放在 frpm Todo.findById() 直到console.log(todo); });进入 todos.js?如果是这样,节点如何知道我指的是什么?
  • 您可以查看我的 repo 以供参考,我创建了 express 应用 github.com/rajatdhoot123/express_server,直到我尝试从头开始向您解释
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2022-11-21
相关资源
最近更新 更多