node.js数组检查失败即使在返回false

时间:2015-05-15 02:10:48

标签: javascript arrays regex node.js null

我在node.js中有一个缓冲区,并且我正在使用正则表达式检查mime类型。
正则表达式中有一个捕获组,如果成功,它必须在exec返回的数组中的索引1处返回此捕获组。

我正在使用

if(mime.exec(dt)[1]){
    tip.push(mime.exec(dt)[1]);
}

这个控件我也试过

if(1 in mime.exec)

以及

mime.exec.hasOwnProperty(1)

但无论如何处理条件并给出追溯

TypeError: Cannot  read property '1' of null

我可以使用哪种机制来解决此问题?

更新----

var mime = / ^ content-type:(。+ \ S)/ igm;

更新----

var fs = require("fs"),
    mime = /^content-type: (.+\S)/igm,
    tip = [];
require("http").createServer(function(req, res) {
    var data = "";
    console.log("working...");
    console.log(req.method);
    if (req.method.toUpperCase() == "POST") {

        req.once("data", function() {
            fs.writeFileSync("dene.txt", "");
        });
        req.on("data", function(dt) {
            fs.appendFileSync("dene.txt", dt.toString("utf8"));
            if (mime.exec(dt)[1]) {
                tip.push(mime.exec(dt)[1]);
            } else {
                return false;
            }

        });

        req.on("end", function() {
            console.log(((fs.statSync("dene.txt").size) / 1024).toFixed(2), "kb");
            console.log(tip);

        });
    }
    res.writeHead(200, {
        "content-type": "text/html"
    });
    res.end(require("fs").readFileSync(require("path").resolve(__dirname, "static_files/post.html")));
}).listen(3000)

3 个答案:

答案 0 :(得分:2)

如果没有更多的上下文(特别是mime的值是如何分配的),很难确切地说出发生了什么,但我们可以肯定地说:mime.exec是{{1在您的代码执行null时。因此,启动调试器并观察mime.exec.hasOwnProperty(1)的值,看看发生了什么。

答案 1 :(得分:1)

问题是你的正则表达式设置了全局标志 - 比较Why RegExp with global flag in Javascript give wrong results?。因此,当您第一次拨打mime.exec(dt)时,它会匹配某些内容并提升mime.lastIndex属性,但是当您第二次拨打mime.exec(dt)找不到第二次匹配< / strong>在dt字符串中。

所以有两件事要做:

  • 当您只打算进行一场比赛时,请不要将其设为global正则表达式 另外,如果您计划重用该对象(例如示例中的多个回调调用),请确保每次都耗尽搜索(通常为while (m = regex.exec(input)))或重置regex.lastIndex=0;
  • 不要两次调用exec(),而只是将结果存储在变量

另请注意,当.exec()null完全匹配时,var match = mime.exec(dt); if (match) // possibly `&& match[1]` if you need to ensure that no empty string was captured tip.push(match[1]); 可能不会返回任何数组,所以无论如何都要使用

var app = angular.module('abc', ['ngRoute','Trancontroller','Terminalcontroller','Settingcontroller','Usercontroller','Devicecontroller','Sidebar_service'])

答案 2 :(得分:1)

更改此

if (mime.exec(dt)[1]) {

到这个

if (mime.exec(dt) && mime.exec(dt)[1]) {

exec返回null或数组 - 首先测试null,因为您不能将null视为数组。

编辑,如评论中所述,如果使用全局正则表达式,可能需要记住其他注意事项。

因此,对于全球正则表达式,超级安全版本:

var rslt = mime.exec(dt)
if (rslt && rslt[1]) {
  tip.push(rslt[1]);