Nodejs TypeError: Cannot call method 'slice' of null,怎么解决呢?

Nodejs TypeError: Cannot call method ‘slice’ of null,怎么解决呢?

E:\nodejs\lianxi\blog\node_modules\mongodb\lib\mongodb\connection\base.js:245 throw message; ^ TypeError: Cannot call method ‘slice’ of null at convert_tree_to_html (E:\nodejs\lianxi\blog\node_modules\markdown\lib\markdown.js:1556:21) at Object.toHTMLTree (E:\nodejs\lianxi\blog\node_modules\markdown\lib\markdown.js:112:14) at Object.toHTML (E:\nodejs\lianxi\blog\node_modules\markdown\lib\markdown.js:82:22) at E:\nodejs\lianxi\blog\models\post.js:74:26 at Array.forEach (native) at E:\nodejs\lianxi\blog\models\post.js:73:10 at E:\nodejs\lianxi\blog\node_modules\mongodb\lib\mongodb\cursor.js:163:16 at commandHandler (E:\nodejs\lianxi\blog\node_modules\mongodb\lib\mongodb\cursor.js:709:16) at E:\nodejs\lianxi\blog\node_modules\mongodb\lib\mongodb\db.js:1846:9 at Server.Base._callHandler (E:\nodejs\lianxi\blog\node_modules\mongodb\lib\mongodb\connection\base.j s:445:41) 下边是我的代码: collection.find(query).sort({time:-1}).toArray(function(err,docs){ mongodb.close(); if(err){ return callback(err); } 73 docs.forEach(function(doc){ 74 doc.post = markdown.toHTML(doc.post); }); callback(null,docs);//成功,已数组返回查询结果


6 回复

针对你遇到的 TypeError: Cannot call method 'slice' of null 错误,问题似乎出现在尝试对一个可能为 null 的对象调用 slice 方法。从错误堆栈来看,问题出现在 convert_tree_to_html 函数中,该函数尝试处理 doc.post 字段,并将其转换为 HTML。

首先,确保 doc.post 不为 nullundefined 再进行操作。你可以通过添加条件判断来避免这个问题。

示例代码修正

collection.find(query).sort({ time: -1 }).toArray(function(err, docs) {
    if (err) {
        return callback(err);
    }

    // 确保 docs 是一个数组
    if (!Array.isArray(docs)) {
        return callback(new Error("Expected an array of documents"));
    }

    docs.forEach(function(doc) {
        // 确保 doc.post 不为 null 或 undefined
        if (doc.post != null) {
            doc.post = markdown.toHTML(doc.post);
        }
    });

    callback(null, docs); // 成功,已数组返回查询结果
});

解释

  • 检查 docs 是否为数组:确保查询结果是一个数组,如果数据库中没有找到文档,则可能返回其他类型的数据。

  • 检查 doc.post 是否存在:在将 doc.post 转换为 HTML 前,先检查它是否不为 nullundefined。这样可以避免在 doc.postnull 时调用 toHTML 方法,从而防止出现 TypeError

通过这种方式,你可以更安全地处理数据,避免因未预期的数据格式导致的运行时错误。


应该docs是null,查询失败,应该是,js出这种错误一般就是因为调用slice的对象为null

但是在查询的时候没有问题啊,然后在上传照片的时候就出问题了。。。

查一下数据库,doc.post这个可能是null的 我遇到这样的问题就是这样的

docs.forEach(function(doc){ if(doc.post){ doc.post = markdown.toHTML(doc.post); } });

74行执行之前加个判断即可. 报错是提示doc.post为null导致后续出错

从错误信息来看,问题出在 markdown.toHTML 方法中,传入的 doc.post 可能为 nullundefined。当你尝试对一个可能为 null 的值调用 .slice() 方法时,就会抛出 TypeError

你可以通过在调用 markdown.toHTML 之前检查 doc.post 是否为 nullundefined 来避免这个问题。

示例代码

collection.find(query).sort({ time: -1 }).toArray(function (err, docs) {
    if (err) {
        return callback(err);
    }

    docs.forEach(function (doc) {
        // 检查 doc.post 是否存在
        if (doc.post != null) {
            doc.post = markdown.toHTML(doc.post);
        } else {
            doc.post = '';  // 或者其他默认值
        }
    });

    callback(null, docs); // 成功,已数组返回查询结果
});

解释

  • forEach 循环内部,增加一个条件判断,确保 doc.post 不是 nullundefined
  • 如果 doc.postnullundefined,可以将其设置为空字符串或其他默认值,以防止在 markdown.toHTML 中出现错误。

这样做可以避免在处理可能为 null 的数据时抛出 TypeError

回到顶部