我在node.js中有一个缓冲区,我正在使用正则摩尔类型。
REGEX中有一个捕获组,如果成功的话,必须在Exec返回的数组中返回该捕获组。
我正在使用
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)
没有更多上下文(尤其是分配的mime
的值),很难确切地说出正在发生的事情,但是我们可以肯定地说的是:mime.exec
是null
您的代码执行mime.exec.hasOwnProperty(1)
的时间。因此,启动调试器并观察mime
的价值以查看发生了什么。
更改此
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]);
问题是您的正则是 global 标志集 - 比较为什么在JavaScript中的RegexP与Global Flag中的javaScript中给出了错误的结果?因此,当您第一次调用mime.exec(dt)
时,它匹配某些内容并推进mime.lastIndex
属性,但是当您第二次调用mime.exec(dt)
时,在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]);