为啥nodejs express服务器在我使用post时返回302?

Posted

技术标签:

【中文标题】为啥nodejs express服务器在我使用post时返回302?【英文标题】:why nodejs express server return 302 when i use post?为什么nodejs express服务器在我使用post时返回302? 【发布时间】:2019-08-27 15:44:22 【问题描述】:

我正在创建一个注册和登录系统。我在 GET 请求中获得了一个表单 html 页面,它工作正常,但是当我使用 post 发布我的数据时,服务器在 chrome 检查中返回 302,并且请求类型是 xhr,因为我没有说重定向或任何告诉浏览器的代码去做。我真的需要帮助。

这是服务器文件

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var signupRouter = require('./routes/signup.js');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded( extended: true ));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/signup', signupRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) 
  next(createError(404));
);

// error handler
app.use(function(err, req, res, next) 
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : ;

  // render the error page
  res.status(err.status || 500);
  res.render('error');
); 

app.listen(3000, "localhost", function() 
  console.log("server started listening on port 3000");
);

module.exports = app;

这是路由器文件

var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) 
  console.log('11212112');

  res.render('signup',  title: 'signup section' );
);

router.post('create', function(req, res, next) 
  console.log('fefffefefef');
  res.statusCode = 200;
  res.send('lfffff');
);

module.exports = router;

这是浏览器上的javascript

        $.post("http://localhost:3000/signup/create",
            
                name: "Donald Duck",
                city: "Duckburg"
            ,
            function (data, status) 
                alert("Data: " + data + "\nStatus: " + status);
            );

    

注意

警报未出现在 post 回调中,我在 chrome 检查时只看到 302

更新

这是邮递员测试网址的图片

【问题讨论】:

createError 是什么? 你只是给我指出了一个我不知道的函数,我把这个脚本从构建一个 node express 教程中作为一个初学者,你认为这是问题吗?我所知道的评论是它可能使用自定义 html 页面处理 404 错误 创建错误是一个处理 404 的函数,参见我使用的脚本中的第一行 var createerror 【参考方案1】:

这是由于需要在路由文件的路由器声明中启用mergeParams

const router = express.Router( mergeParams: true );

https://expressjs.com/en/api.html#express.router

mergeParams -- 保留来自父路由器的 req.params 值。 如果父母和孩子有冲突的参数名称,孩子的 值优先。

我创建的通用 todo 存储库的示例实现:https://github.com/jongear/async-api-example-js/blob/master/src/routes/todoRoutes.js#L4

【讨论】:

【参考方案2】:

请更改您的发帖路线,如下所示:

router.post('/create', function(req, res, next) 
  console.log('fefffefefef');
  res.statusCode = 200;
  res.send('lfffff');
);

你错过了一个斜线。

斜线 '/' 很重要,因为您的 BASEURL 是 http://localhost:3000 而不是 http://localhost:3000/

【讨论】:

还是一样。 奇怪的是控制台函数没有打印任何东西,这可能告诉我该函数根本没有被调用,因为响应代码不同并且控制台没有打印 你尝试过邮递员的网址吗?返回 res.json('something');检查? 302 发现返回 .. 用图片检查我更新的问题 能否将get list route移到create route下方查看一下?

以上是关于为啥nodejs express服务器在我使用post时返回302?的主要内容,如果未能解决你的问题,请参考以下文章

为啥nodejs express post请求中的“body”为空?

为啥我无法从任何网络连接到 NodeJS express 服务器?

NodeJS,Express,我为啥要使用 app.enable('trust proxy');

如果我可以只用 nodejs 本身做所有事情,我为啥要使用 Express? [关闭]

create-react-app + nodejs (express) 服务器

安装了node.js之后安装express时为啥安装不成功