Nodejs出现这个错误是为什么?

Nodejs出现这个错误是为什么?

照着nodejs实战 书中的用nodejs + angularjs + socket + mongodb 弄得一个聊天程序,不知道怎么回事出现这个问题,是session的原因?

d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\nodeT\node API\mean_talk\node_modul
es\connect\lib\utils.js:232 **return 0 == str.indexOf(‘s:’) ** ^ **TypeError: Cannot call method ‘indexOf’ of undefined\n ** at exports.parseSignedCookie (d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\n odeT\node API\mean_talk\node_modules\connect\lib\utils.js:232:19) at messages (d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\nodeT\node API\mea n_talk\app.js:86:16) at Array.0 (d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\nodeT\node API\mean _talk\node_modules<a href=“http://socket.io”>socket.io\lib\index.js:117:7) at run (d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\nodeT\node API\mean_tal k\node_modules<a href=“http://socket.io”>socket.io\lib\namespace.js:114:11) at Namespace.run (d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\nodeT\node AP I\mean_talk\node_modules<a href=“http://socket.io”>socket.io\lib\namespace.js:126:3) at Namespace.add (d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\nodeT\node AP I\mean_talk\node_modules<a href=“http://socket.io”>socket.io\lib\namespace.js:155:8) at Client.connect (d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\nodeT\node A\n PI\mean_talk\node_modules<a href=“http://socket.io”>socket.io\lib\client.js:67:20) at Server.onconnection (d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\nodeT\n ode API\mean_talk\node_modules<a href=“http://socket.io”>socket.io\lib\index.js:307:10) at Server.EventEmitter.emit (events.js:95:17) at Server.handshake (d:\Coding\My sites T\绉掑井璇惧爞瀛︿範\demo\nodeT\node API\mean_talk\node_modules<a href=“http://socket.io”>socket.io\node_modules<a href=“http://engine.io”>engine.io\lib\server.js:250:8 )


7 回复

根据你提供的错误信息,问题出在 connect 模块的 utils.js 文件中。具体错误是 TypeError: Cannot call method 'indexOf' of undefined,这意味着在调用 str.indexOf('s:') 方法时,strundefined

错误原因分析

这个错误通常发生在尝试访问或操作未定义的对象属性时。在这个特定的例子中,str 变量应该是某个字符串,但实际传递给 parseSignedCookie 函数的是 undefined

示例代码

假设你的代码类似如下:

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

app.use(connect.cookieParser('your_secret_key'));
app.use(connect.session({
    secret: 'your_secret_key',
    cookie: { maxAge: 60000 }
}));

app.use(function(req, res) {
    req.session.user = 'john';
    res.end('Hello ' + req.session.user);
});

app.listen(3000);

解决方法

  1. 确保 cookie-parserexpress-session 已安装

    npm install express-session cookie-parser
    
  2. 正确初始化中间件: 确保在使用 cookieParsersession 中间件之前已经安装并正确引入了它们。

  3. 检查配置是否正确: 确保 secretcookie 配置正确,并且没有遗漏任何步骤。

修改后的代码示例

const express = require('express');
const session = require('express-session');
const cookieParser = require('cookie-parser');

const app = express();

app.use(cookieParser('your_secret_key'));
app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true,
    cookie: { maxAge: 60000 }
}));

app.get('/', (req, res) => {
    req.session.user = 'john';
    res.send('Hello ' + req.session.user);
});

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

总结

错误通常是由于 cookiesession 配置不正确导致的。确保你正确安装并配置了 cookie-parserexpress-session。此外,确保 secret 的值是唯一的并且不容易被猜测到。如果问题仍然存在,请检查是否有其他中间件或代码干扰了 cookiesession 的处理。


变量str可能没有值吧, 最好是找个调试工具进行调试,这样你会学习的更快

str是null,node的debug确实让人头疼,这里根本就看不出错误,只能一步步调试

能推荐一个调试工具吗?

利用socket.io 设置了cookie之后 ,就会出现这个报错,/n io.set(‘authorization’, function(handshakeData, accept) { }) ,删掉就没事 ,不知道为什么??

这里的问题还是挺容易看出来的吧。 TypeError: Cannot call method ‘indexOf’ of undefined — 不能调用undefined的indexOf方法。

结合这个: return 0 == str.indexOf(‘s:’) ^ 应该知道个大概齐。

根据你提供的错误信息,错误发生在 connect 模块的 utils.js 文件中。具体错误为 TypeError: Cannot call method 'indexOf' of undefined,这表明在尝试调用 indexOf 方法时,传入的 str 参数是 undefined

可能的原因

str 参数为 undefined 通常是因为某个函数返回了 undefined 或者在调用 indexOf 方法之前,没有正确初始化或赋值 str

示例代码

假设问题出现在解析签名的 cookie 时,可能的示例如下:

// utils.js
exports.parseSignedCookie = function(str, secret) {
    if (!str) { // 检查是否为 undefined 或 null
        return null;
    }
    if ('s:' === str.substr(0, 2)) { // 使用条件判断代替直接调用 indexOf
        str = str.slice(2);
        if (secret && !compare(str, secret)) {
            return null;
        }
        return str;
    }
};

function compare(str1, str2) {
    // 假设这是一个用于比较的方法
    return str1 === str2;
}

修改建议

  1. 检查变量是否已定义:在调用 indexOf 之前,确保 str 是一个字符串。
  2. 使用条件语句:使用条件语句(如 if)来判断 str 是否以特定前缀开头,而不是直接调用 indexOf 方法。
  3. 调试日志:添加一些调试日志来查看变量的实际值,以便更好地理解问题所在。

通过上述方法可以避免 strundefined 导致的错误,并确保程序的稳定性。

回到顶部