Nodejs express 表单内容传出

Nodejs express 表单内容传出

1.我在routes/index.js中添加了提取表单内容 exports.doSearch = function(req, res){
//console.log(req.params.doSearch);//输出index var namevalue = req.body.username;
console.log(namevalue);//输出表单post提交的login_name
res.send(‘great you are right for post method:’ + namevalue);//显示页面文字信息
return namevalue; }; 2.我在另外一个文件search.js文件中想引用index.js中的namevalue值 var searchResult = require(’./routes/index’); var myname = searchResult.doSearch(); 发现报错: C:\project\ex03\routes\index.js:21 var namevalue = req.body.username; ^ TypeError: Cannot read property ‘body’ of undefined at Object.exports.doSearch (C:\project\ex03\routes\index.js:21:21) at Object.<anonymous> (C:\project\ex03\search.js:8:28) at Module._compile (module.js:456:26) at Object.Module._extensions…js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) at startup (node.js:119:16) at node.js:906:3 3.请问我怎样才能将namevalue传出来?


6 回复

要解决你遇到的问题,我们需要理解Express框架的工作原理以及如何正确地处理路由请求。以下是详细的解决方案和示例代码。

解决方案

  1. 确保正确设置路由doSearch函数应该被定义为一个路由处理程序,而不是直接调用。
  2. 正确调用路由处理程序:你需要通过发送HTTP请求来触发路由处理程序,而不是直接调用它。

示例代码

1. routes/index.js

首先,确保你的路由处理程序被正确设置:

const express = require('express');
const router = express.Router();

router.post('/doSearch', function(req, res) {
    console.log(req.params); // 输出 { doSearch: 'index' }
    var namevalue = req.body.username;
    console.log(namevalue); // 输出表单post提交的username值
    res.send('Great, you are right for POST method: ' + namevalue); // 显示页面文字信息
});

module.exports = router;

2. app.jsserver.js

确保在你的主应用文件中使用这个路由:

const express = require('express');
const app = express();
const indexRouter = require('./routes/index');

// 使用body-parser中间件来解析请求体
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use('/', indexRouter);

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

3. 发送POST请求

为了测试这个路由,你可以使用Postman或编写一个简单的客户端脚本来发送POST请求:

const axios = require('axios');

axios.post('http://localhost:3000/doSearch', {
    username: 'testUser'
})
.then(response => {
    console.log(response.data);
})
.catch(error => {
    console.error(error);
});

解释

  • 路由处理程序doSearch函数现在是一个Express路由处理程序,它接收POST请求并处理请求体中的数据。
  • 中间件body-parser中间件用于解析请求体中的JSON或URL编码数据。
  • 测试:通过发送POST请求到指定的端点,可以验证路由处理程序是否正常工作。

这样,你就可以正确地从表单中提取数据,并将其传递给相应的处理逻辑。


var myname = searchResult.doSearch(req,res);

你REQ没丢进去。req在INDEX.JS里面就是UD

亲,缺少参数,前面导出的方法带有req,res,而你的body属性是req的,这里引用的时候不带参数当然就是找不到body from undefined

首先像一楼说的 要var myname = serarchResult.doSearch(req, res) 试了还不行要看是不是出错了报什么错, 你可以在search.js中输出req 看下里面的req,body的信息是否有username

在Express应用中,req 对象代表HTTP请求,并包含客户端请求的数据。当你尝试从 search.js 文件直接调用 doSearch 函数时,Express框架不会自动填充 req 参数,因此你会遇到 TypeError: Cannot read property 'body' of undefined 错误。

解决方案

你可以通过修改 doSearch 方法使其返回一个Promise,然后使用中间件来处理HTTP请求和响应。以下是解决方案:

routes/index.js 修改后的内容

const express = require('express');
const router = express.Router();

router.post('/search', function(req, res) {
    console.log(req.params.doSearch); // 输出index
    var namevalue = req.body.username;
    console.log(namevalue); // 输出表单post提交的login_name
    res.send(`great you are right for post method: ${namevalue}`); // 显示页面文字信息
});

exports.router = router;

暴露路由到其他文件

app.js 或其他入口文件中设置路由:

const express = require('express');
const app = express();
const indexRouter = require('./routes/index');

app.use(express.urlencoded({ extended: true })); // 支持解析 URL 编码的表单数据
app.use('/search', indexRouter);

// 其他中间件和路由

search.js 示例

为了验证结果或测试目的,你可以创建一个简单的Express服务器:

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

app.use(express.json()); // 如果你使用的是JSON格式的数据
app.use(express.urlencoded({ extended: true })); // 如果你使用的是表单数据

// 你可以在这里添加一个简单的POST请求来测试功能
app.post('/test-search', (req, res) => {
    const namevalue = req.body.username;
    console.log('Received namevalue:', namevalue);
    res.send(`great you are right for post method: ${namevalue}`);
});

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

现在,你可以向 /test-search 发送一个POST请求,例如使用Postman或者命令行工具 curl 来测试你的应用是否正确地接收并处理了表单数据。

这种方式让你能够正确地处理HTTP请求,并且避免了在非HTTP上下文中错误地访问 reqres

回到顶部