javascript - express先后对同一路径采用post和get访问问题

查看:163
本文介绍了javascript - express先后对同一路径采用post和get访问问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我在写一个论坛webapp,vue+express+mongodb;

vue的app.vue下有一个首页/home,在这里向express发起方式为GET,路径为/post的请求,用于获取文章数据,另外一个vue路由为发表文章的路由,在这里发表文章,提交时访问express的/post,方式为POST。

测试能够正常获取文章数据,但是当我发表文章提交,express成功将文章保存到了数据库,返回200状态码,然后前端通过vue路由回到首页,再次向express发起请求获取文章数据,这时候express服务器就挂了。提示不能在响应头发送后再设置响应头。然后我只有重启服务器再访问首页,又能正常读取到文章数据了。求问怎么回事?

express的post路由如下:

var express = require('express');
var router = express.Router();
var Post = require('../models/post');
var moment = require('moment');
var jwt = require("jwt-simple");

router.get('/',function(req,res,next){
    Post.get(function(err,posts){
        if(err){
            res.status(404);
            res.end();
        }
        res.status(200);
        res.json({
            posts:posts
        });
    });
});
router.post('/',function(req,res,next){
    var token = req.body.access_token;
    if(token){
        try{
            var decoded = jwt.decode(token,req.app.get('jwtTokenSecret'));
            if(decoded.exp < Date.now()){
                console.log("haha")
                res.end('token expired',401);
            }
            //console.log(decoded)
             var newPost = new Post({
                name:decoded.iss,
                title:req.body.title,
                content:req.body.content
            });
            console.log(newPost);
            newPost.save(function(err,post){
                if(err){
                    console.log("发表文章失败");
                    res.status(500);
                    res.send({error:1});
                }
                console.log('发表文章成功');
            });
            res.status(200);
            res.send({});
        } catch(err){
            res.status(401);
            res.send('no token');
        }
    }
});
module.exports = router;

求大神相助,谢谢啦

解决方案

乍一看,这代码一大堆的问题!

1) req.app.get('jwtTokenSecret')这里出错了,一看到这个req就觉得奇怪。但是这个解码中间件没用过,为防被打脸,还专门搜了一下。这里应该是var decoded = jwt.decode(token, app.get('jwtTokenSecret')); CtrlC CtrlV 是程序员用的最多的按键,这都搞错的话职业素养还需加强啊。

2)if语法问题。你的if(err)内部既没有return后面也没else分支,所以err为真时整个函数体的代码都执行了,而你本意是一个if else。这里我猜你认为res.end会终止整个响应函数?

3)一个响应如果已经end之后,是不能再去设置status的,否则会报错退出程序。在express里面,每次调用send、json这些响应方法的时候,都会自动附加一个end。你send之后还来一个status,程序终结。

4)try catch 不能捕捉异步里面的异常,而newPost.save这显然是一个异步过程,所以你这里的try catch只能捕捉到同步过程中的异常。话说,你是想捕捉哪一步的异常呢?我猜只是想捕捉解码那部分吧。try里面包的东西太多了,你本来就想不让解码的出错影响到其他,但是后面你还用了name:decoded.iss,那这个try catch就耐人寻味了。应该将catch放在这句之前。

接下来我就帮你还原一下这个流程是怎么挂的吧。首先是post请求发文对吧,一个请求过来,首先在var decoded = jwt.decode(token,req.app.get('jwtTokenSecret'));这里就应该挂了,第一个if,如果进去又挂了,然后new也可能挂一次,save异步直接过去,然后res.send。接着save的异步里面又有可能挂一次。或者catch 里面也会挂一次。所以我觉得应该不是在你请求的时候才挂的,应该是早挂了吧?

说实话,我还是建议你好好看看js语法,然后好好看看官方文档,然后再好好看看别人代码,才来写你的。

这篇关于javascript - express先后对同一路径采用post和get访问问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆