Nodejs express新手求助:app.post

Nodejs express新手求助:app.post

现在想用app.post, 怎么能把要post的数据写进request里呢,除了http.request(options, cb_fn). 目标是在一个get之后做个post. 想法是,get的callback最后res.redirect(post_url), 但是不知道怎么把数据放进去

10 回复

当然可以。根据你的需求,你希望在处理一个 GET 请求后,将某些数据通过 POST 请求发送到另一个 URL。你可以使用 expressaxios 或者 node-fetch 来实现这一点。这里我将使用 axios 作为 HTTP 客户端来演示如何实现这个功能。

示例代码

首先,确保你已经安装了 expressaxios

npm install express axios

然后,你可以编写以下代码:

const express = require('express');
const axios = require('axios');

const app = express();
const PORT = 3000;

// 解析请求体中的 JSON 数据
app.use(express.json());

app.get('/get', (req, res) => {
    // 假设我们从 GET 请求中获取一些数据
    const dataToPost = {
        key1: 'value1',
        key2: 'value2'
    };

    // 将数据存储在会话或查询参数中
    req.session = { postData: dataToPost };
    
    // 重定向到 POST 请求的 URL
    res.redirect(`/post`);
});

app.post('/post', async (req, res) => {
    try {
        // 从会话或查询参数中获取之前保存的数据
        const postData = req.session.postData;

        // 发送 POST 请求到目标 URL
        const response = await axios.post('http://example.com/post-url', postData);

        // 处理响应
        res.send(`POST request sent successfully! Response status: ${response.status}`);
    } catch (error) {
        console.error(error);
        res.status(500).send('Error sending POST request.');
    }
});

app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

解释

  1. GET 请求处理

    • /get 路由中,我们假设从 GET 请求中获取了一些数据,并将其存储在 req.session 中。
    • 然后,我们使用 res.redirect 将用户重定向到 /post 路由。
  2. POST 请求处理

    • /post 路由中,我们从 req.session 中获取之前保存的数据。
    • 使用 axios.post 方法将数据发送到指定的 URL(在这个例子中是 http://example.com/post-url)。
    • 根据响应的状态码返回相应的结果。

这种方法确保了在 GET 请求处理完成后,可以将必要的数据传递给 POST 请求。


不大明白楼主的意思。redirect 通常是个get. 不过我可能理解有误,req.session.post_data=“asdfasf”, 是否可以?

post需要浏览器发起,你redirect是不行的。楼主不如忘了你现在的方案,把你想要做什么写出来,让大家给你想想办法。

我现在是在做github OAuth的认证。http://developer.github.com/v3/oauth/

从第一步得到code后,POST https://github.com/login/oauth/access_token, 和一些其他已知的数据。我想说post不用用户出发,直接在第一步后做。现在我是用js: $.ajax(method:post), 但是有些数据都是敏感的,这样很不好的

我是想说 有什么办法可以在 function(req, res) { 这个是某个get的处理函数,能在这里面直接出发个post吗? }

应该http.request 到github

数据用: req.write("asdfasdf“) req.end()

我的想法不合理。

合理的,你要的是client http, 这儿有个例子,你说的数据就是用write, 然后end结束。 http://www.nodejs.org/api/http.html#http_http_request_options_callback

我的想法是做http嵌套,http 的设计就是一次性的请求返回。我明白你的意思。之前我看过了。我原来的想法是: function(req, res) { new https; https.request(post_request, function(response) { response.verb … }); }

有两个httpresponse的object: res, response, 没什么必要,也不符合http协议的制定。

在Express中使用app.post接收POST请求时,你需要在客户端发起一个POST请求,并将数据包含在请求体中。如果你希望通过GET请求后重定向到一个POST URL,并且希望在重定向时传递一些数据,通常的做法不是直接在GET响应中进行重定向,而是将数据保存在会话或数据库中,然后在POST请求处理逻辑中读取这些数据。

示例代码

客户端(发起POST请求)

假设你想通过表单提交数据:

<!-- form.html -->
<form action="/submit" method="POST">
    <input type="text" name="data" />
    <button type="submit">Submit</button>
</form>

服务器端(处理POST请求)

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

const app = express();
app.use(bodyParser.urlencoded({ extended: false })); // 解析URL编码的请求体
app.use(bodyParser.json()); // 解析JSON格式的请求体

// 处理POST请求
app.post('/submit', (req, res) => {
    const data = req.body.data;
    console.log('Received data:', data);
    res.send(`Received data: ${data}`);
});

// 处理GET请求并重定向
app.get('/get', (req, res) => {
    res.send('<a href="/submit">Submit your data</a>');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 客户端:创建一个简单的HTML表单,当用户点击提交按钮时,浏览器会向/submit发送POST请求。
  2. 服务器端
    • 使用body-parser中间件解析请求体中的数据。
    • /submit路径上定义POST处理函数,获取并打印从请求体中接收到的数据。
    • /get路径上的GET请求处理函数返回一个链接,该链接指向/submit

这种方法允许你在用户提交表单时触发POST请求,并在服务器端处理数据。如果需要从GET请求中传递数据到POST请求,可以考虑使用session或cookie来存储临时数据。

回到顶部