求助,关于 Express 请求 url 里的 undefined
发布于 10个月前 作者 sysudengle 861 次浏览

在使用 Express 来做一个应用的时候发现每次加载页面总会去 GET 多一次当前 url,并且第二次 GET 时的 url 会变为 undefined。 比如我路由的代码为:

app.get('/index', routes.index);

第一次得到结果 GET /index,但是会多得到 GET /undefined

又比如路由的代码是

app.get('/home/:username', routes.home);

假设我 url 是 /home/test,第一次 GET 是正常的,后面多出一次 GET /home/undefined。 调试了很久还是看不出问题所在,求各位帮忙分析下有什么可能,感激不尽!

3 回复

你试一下直接用curl 请求一下 ?

如果用curl 正常的话,可能是客户端请求了些什么东西

能否把你的app和路由代码都贴出来一下。 就这样很难分析问题出在哪里了。

curl是正常的,我在登录之前都是只访问一次,登录之后都会多出来一个访问,app的代码如下,谢谢!


/**
 * Module dependencies.
 */

var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');
//mongodb
var MongoStore = require('connect-mongo');
var settings = require('./settings');
//var flash = require('connect-flash');
var MongoStore = require('connect-mongo')(express);

var app = express();
//new add layout
var expressLayouts = require('express-ejs-layouts');


// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(expressLayouts);
//app.use(flash());
//new add layout
//app.set('layout', 'myLayout');

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.bodyParser({uploadDir: './public/images/dog'}));//uploaded tmp img dir
//app.use(express.router.routes);
app.use(express.cookieParser('your secret here'));

app.use(express.static(path.join(__dirname, 'public')));

//use mongodb
app.use(express.cookieParser());
app.use(express.session({
    secret: settings.cookieSecret,
    cookie: {maxAge: 1000*60*60},//one hour lifespan
    store: new MongoStore({
        db: settings.db
    })
}));

//app.router should be after cookie and session use
app.use(app.router);
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/index', routes.index);
app.get('/home/:username', routes.home);
//app.get('/home1/:username', routes.home1);
app.get('/info', routes.info);
app.get('/login', routes.login);
app.post('/login', routes.doLogin);
app.get('/reg', routes.reg);
app.post('/reg', routes.doReg);
app.get('/logout', routes.logout);

app.post('/search', routes.search);
app.post('/followuser', routes.followUser);
app.post('/deletetemprelation', routes.deleteTempRelation);
app.post('/deletefollow', routes.deleteFollow);

app.get('/myfans', routes.getFans);
app.get('/myfollows', routes.getFollows);

app.post('/sendmsg', routes.sendmsg);
app.post('/updateinfo', routes.updateInfo);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

//chat function
var io = require('socket.io').listen(8080);  
io.set('log level', 1);  
global.USERS_NAME = {};  
var userSocketList = [];
var userNameList = [];

io.sockets.on('connection', function (socket) {  
  io.sockets.emit('connect',{hello:'boy'});  
  
  socket.on('private message', function (from,to,msg) {  
    console.log('I received a private message by ', from, ' say to ',to, msg);  
    if(to in USERS_NAME){  
        console.log('emit!');
        //console.log(USERS_NAME[to]);
        console.log(USERS_NAME);
        USERS_NAME[to].emit('to'+to,{from: from, to: to, message:msg});  
        USERS_NAME[from].emit('to'+from,{from: from, to: to, message:msg});
    }  
    else
    {
        USERS_NAME[from].emit('to'+from,{from: from, message:to + "不在线!"});
    }
  });  
  socket.on('new user',function(data){  
     if(data in USERS_NAME){  
          
     }else{  
        var nickname = data;  
        USERS_NAME[nickname]= socket;  
        userSocketList.push(socket);
        userNameList.push(nickname);
        console.log('newUser' + nickname);
     }  
//   console.log(USERS_NAME);
//     console.info(USERS_NAME);  
  });  
  socket.on('disconnect', function () {  
    var index = userSocketList.indexOf(socket);
    userSocketList.splice(index, 1);
    delete USERS_NAME[userNameList[index]];
    userNameList.splice(index, 1);
    //console.log(user);
    console.log('----------');
    io.sockets.emit('user disconnected');  
    console.info(USERS_NAME);  
  });  
}

路由代码:


/*
 * GET home page.
 */

var fs = require('fs');
var crypto = require('crypto');
var User = require('../models/user.js');
var Msg = require('../models/msg.js');
var Relation = require('../models/relation.js');
var imgDogDir = '/images/dog/';

var requireLogin = function(req, res)
{
    if(req.session.user == null)
        res.redirect('/login');
    global.dogImgPath = req.session.user.img;
};

module.exports.index = function(req, res){
    requireLogin(req, res);
    var username = req.session.user.name;
    var msgs = null;
    var otherMsgs = null;
    console.log(USERS_NAME);
    console.log('gggggggggggggg');
    Msg.get(null, function(err, msgsParam){
        if(!err)
        {
            msgs = msgsParam;
        }

        res.render('index', { title: 'Index', username: username, msgs: msgs});
    });
    //res.render('index', { title: 'Express' });
};

module.exports.login = function(req, res){
    res.render('login', { title: 'login' });
};

module.exports.doLogin = function(req, res){
    var md5 = crypto.createHash('md5');
    var password = md5.update(req.body.password).digest('base64');
    User.get(req.body.username, function(err, user) { 
        if (!user) { 
            //req.flash('error', '用户不存在'); 
            return res.redirect('/login'); 
        } 
        if (user.password != password) { 
            //req.flash('error', '用户口令错误'); 
            return res.redirect('/login'); 
        } 
        req.session.user = user; 
        //req.flash('success', '登入成功'); 
        //res.redirect('/home/' + user.name);
        /*fs.exists(imgDogDir + user.name + '.png', function(err){
            if(!err) global.dogImgPath = imgDogDir + 'default.png';
            else global.dogImgPath = imgDogDir + user.name + '.png';
            console.log(err);
            console.log(global.dogImgPath);
        });*/
        global.dogImgPath = user.img;
        res.redirect('/index');
    }); 
};

module.exports.reg = function(req, res){
    var mongodb = require('mongodb');
    var server = new mongodb.Server('localhost',27017,{auto_reconnect:true});
    var db = new mongodb.Db('mydb',server,{safe:true});

    db.open(function(err,db){
        if(!err)
    {  
        console.log('connect');
    }else{
        console.log(err);
    }  

    });
    res.render('reg', { title: '用户注册' });
};

module.exports.doReg = function(req, res){
    //res.render('reg', { title: 'register successfully' });
    console.log("doReg!!!!!!!!!!!!");
    if (req.body['password-repeat'] != req.body['password']) {
        req.flash('error', '两次输入的口令不一致');
        return res.redirect('/reg');
    }

    //生成口令的散列值
    var md5 = crypto.createHash('md5');
    var password = md5.update(req.body.password).digest('base64');
    var newUser = new User({
        name: req.body.username,
        password: password,
    });
    console.log("doReg22222222!!!!!!!!!!!!");

    //检查用户名是否已经存在
    User.get(newUser.name, function(err, user) {
        if (user)
            err = 'Username already exists.';
        if (err) {
            console.log("exist!!!!!!!!!!!!");
            //req.flash('error', err);
            return res.redirect('/reg');
        }

        //狗狗图片处理
        var tmpPath = req.files.dogImg.path;
        console.log(tmpPath);
        var imgType = (req.files.dogImg.type) == 'image/png'?'.png':'.jpg';
        var targetFile = './public/images/dog/' + newUser.name + imgType;
        console.log(req.files.dogImg.type);
        fs.rename(tmpPath, targetFile, function(err){
            if(err) throw err;

            targetFile = targetFile.slice(8);//去掉./public
            newUser.img = targetFile;
            console.log(newUser);
            newUser.save(function(err, user) {
                if (err) {
                    console.log("register error!");
                    //req.flash('error', err);
                    return res.redirect('/reg');
                }
                req.session.user = newUser;
                console.log("Registered!!!!!!!!!!!!" + newUser);
                //req.flash('success', '注册成功');
                //res.redirect('/home/' + newUser.name);
                global.dogImgPath = targetFile;
                res.redirect('/index');
                
            });
        });
        //如果不存在则新增用户
    });
};

module.exports.logout = function(req, res){
    req.session.user = null;
    res.redirect('/login');
};


module.exports.home1 = function(req, res){
    var username = "su";
    console.log("!!!!!!!!!!!");
    return res.render('home2', { title: 'User home', username: username});
};

module.exports.home = function(req, res){
    console.log(req.params.username);
    console.log(req.url);
    if(req.params.username == undefined)
    {
        console.log('askhdaksjdh');
        return;
    }
    else
    {
        console.log(req.params.username);
    }
    requireLogin(req, res);
    console.log('00000000000000000000');
//  var username = req.session.user.name;
    var username = req.params.username;
    var msgs = null;
    var otherMsgs = null;
    Msg.get(username, function(err, msgsParam){
        if(!err)
        {
            msgs = msgsParam;
        }
        User.get(username, function(err, user) {
            console.log(username);
            console.log('!!!!!!!!!!!');
            console.log(user.img);
            if (err) {
                console.log("exist!!!!!!!!!!!!");
                //req.flash('error', err);
                
            }
            User.get(username, function(err, user){
                console.log(user);
                if(user)
                {
                    return res.render('home', { title: 'User home', username: username, msgs: msgs, user: user});
                }
                else
                {
                    return res.render('home', { title: 'User home', username: username, msgs: msgs});
                }
                return res.render('home', { title: 'User home', username: username, msgs: msgs, otherImg: user.img});
            });
        });
    });
};


module.exports.info = function(req, res){
    requireLogin(req, res);
    var username = req.session.user.name;
    User.get(username, function(err, user){
        console.log(user);
        if(user)
        {
            return res.render('info', { title: '狗狗信息', user: user, username: username});
        }
        else
        {
            return res.render('info', { title: '狗狗信息', err: true, username: username});
        }
    });
};

module.exports.search = function(req, res){
    var username = req.body.username;
    console.log(username);
    console.log("+++++++++++++++++++++++++");
    requireLogin(req, res);
    var info = {
        title: "Search",
        view: "search",
        userListQuery: { name: { $regex: username, $options: 'i'} }
    };
    getUserList(req, res, info);
    //User.getList(username, function(err, users) {
    //  if (users)
    //      err = 'user exists';
    //  if (err) {
    //      console.log("exist!!!!!!!!!!!!");
    //      //req.flash('error', err);
    //      console.log(users);
    //      Relation.getMap({ user1: req.session.user.name }, function(err, follows){
    //          console.log('~~~get Friend');
    //          console.log(req.session.user.name);
    //          console.log(users);
    //          console.log(follows);
    //          if(!err)
    //          {
    //              var deleteIndex = -1;
    //              users.forEach(function(user, index){
    //                  if(user.name in follows)
    //                  {
    //                      users[index].follow = true;
    //                      console.log(user.name);
    //                  }
    //                  if(user.name == req.session.user.name)
    //                  {
    //                      deleteIndex = index;
    //                      console.log("iiiiiiiiiiiiiiiiii");
    //                  }
    //              });
    //              if(deleteIndex != -1)
    //              {
    //                  delete users[deleteIndex];
    //              }
    //          }
    //          console.log(users);
    //          return res.render('search', { title: 'Search', users: users, username: req.session.user.name });
    //      });
    //  }
    //  else {
    //      return res.render('search', { title: 'Search', error: true });
    //  }
    //});
};

getUserList = function(req, res, info)
{
    User.getList(info.query, function(err, users) {
        if (users)
            err = 'user exists';
        if (err) {
            console.log("exist!!!!!!!!!!!!");
            //req.flash('error', err);
            console.log(users);
            Relation.getMap({ user1: req.session.user.name }, function(err, follows){
                console.log('~~~get Friend');
                console.log(req.session.user.name);
                console.log(users);
                console.log(follows);
                if(!err)
                {
                    var deleteIndex = -1;
                    users.forEach(function(user, index){
                        if(user.name in follows)
                        {
                            users[index].follow = true;
                            console.log(user.name);
                        }
                        if(user.name == req.session.user.name)
                        {
                            deleteIndex = index;
                            console.log("iiiiiiiiiiiiiiiiii");
                        }
                    });
                    if(deleteIndex != -1)
                    {
                        delete users[deleteIndex];
                    }
                }
                console.log(users);
                return res.render(info.view, { title: info.title, users: users, username: req.session.user.name });
            });
        }
        else {
            return res.render(info.view, { title: info.title, error: true });
        }
    });
}

module.exports.getFans = function(req, res){
    requireLogin(req, res);
    var username = req.session.user.name;
    var fansQuery = {user2: username};

    Relation.getMap(fansQuery, function(err, fans){
        if(err)
        {
            return res.render('myFans', {title: "myFans", err: true });
        }
        
        var followsQuery = {user1: username};
        Relation.getMap(followsQuery, function(err, follows){
            if(err)
            {
                return res.render('myFans', {title: "myFans", err: true });
            }
            var users = [];
            for(var fan in fans)
            {
                var isFollow = false;
                if(fan in follows) isFollow = true;
                users.push({name: fan, follow: isFollow});
            }
            return res.render('myFans', {title: "myFans", users: users, username: username });
        });
    });
};

module.exports.getFollows = function(req, res){
    requireLogin(req, res);
    var username = req.session.user.name;
    var query = {user1: username};

    Relation.getMap(query, function(err, follows){
        if(err)
        {
            return res.render('myFollows', {title: "myFollows", err: true });
        }
        
        var users = [];
        for(var name in follows)
        {
            users.push({name: name, follow: true});
        }
        return res.render('myFollows', {title: "myFollows", users: users, username: username });
    });
    
};

module.exports.sendmsg = function(req, res){
    console.log("send suck!");
    console.log(req.body.user);
    var newMsg = new Msg({
        user: req.body.user,
        content: req.body.content,
        time: req.body.time,
        good: 0,
    });
    newMsg.save(function(err, msg){
        if (err)
        {
            console.log("error while writing to db");
            return res.jsonp({stat: false});
        }
        return res.jsonp({stat: true});
    });
};

module.exports.updateInfo = function(req, res){
    requireLogin(req, res);
    var username = req.session.user.name;
    var data = { dog:
        {
            gender: req.body.gender,
            type: req.body.type,
            place: req.body.place,
        }
    };
    console.log(data);
    User.update(username, data, function(err, result){
        if(err)
        {
            console.log("error while update info");
            return res.jsonp({stat: false});
        }
        return res.jsonp({stat: true});
    });
};

module.exports.followUser = function(req, res){
    requireLogin(req, res);
    //new Follow
    var relation = new Relation({ 
        user1: req.session.user.name,
        user2: req.body.user2, 
    });
    relation.save(function(err, relation) {
        if (err)
        {
            console.log("follow suc to db");
            return res.jsonp({stat: false});
        }
        return res.jsonp({stat: true});
    });
};

module.exports.deleteTempRelation = function(req, res){

};

module.exports.deleteFollow = function(req, res){
    requireLogin(req, res);
    //delete Follow
    var relation = new Relation({ 
        user1: req.session.user.name,
        user2: req.body.user2, 
    });
    //first parameter is isTemp
    relation.deleteRelation(false, function(err, relation) {
        if (err)
        {
            console.log("remove follow suc to db");
            return res.jsonp({stat: false});
        }
        return res.jsonp({stat: true});
    });

};
//module.exports = function(app) {
//  app.get('/', function(req, res) {
//      res.render('index', {
//          title: '首页'
//      });
//  });
//
//  app.get('/reg', function(req, res) {
//      res.render('reg', {
//          title: '用户注册',
//      });
//  });
/
回到顶部