gpt4 book ai didi

javascript - 无法在javascript中调用null的方法 'toString'-nodejs

转载 作者:行者123 更新时间:2023-12-03 03:29:59 25 4
gpt4 key购买 nike

我是 JS 新手,正在尝试编写一个简单的网络服务器。这是我的 prj 浏览器。当我转到浏览器时 - http://localhost:4000/home.html

我收到错误 - 无法调用 null 的方法“toString”。

问题是 UrlResLoader.httpcode 和 UrlResLoader.fileType 未定义

  var UrlResLoader = new UrlLoader();
UrlResLoader.requestUrl(fileResEngine);
res.writeHead(UrlResLoader.httpcode, UrlResLoader.fileType);
res.write(UrlResLoader.data);
res.end()

我不确定这里出了什么问题,我已经连接了调试器,发现问题发生在 fs.readFile(fileResEngine.fullpath, function (err, data) 上。

我仍然不清楚为什么会发生这种情况。经过一番研究,我发现为了调用闭包函数,我应该保存“this”指针来引用成员变量。否则,实例将会有所不同。但是,这并没有解决问题。此外,任何设计缺陷或评论都将在这里受到欢迎。

enter image description here

这是我的代码 -

主文件-

const http = require('http');
const parseUrl = require('parseurl');


const fileEngine = require('./fileErrHandler');
const UrlLoader = require('./urlController');

http.createServer( function (req, res)
{
try
{

// this is a library function
var pathName = decodeURIComponent(parseUrl(req).pathname);

var fileResEngine= new fileEngine(pathName);

// create a literal validateFile to validate the path
fileResEngine.pathCheck();
if (fileResEngine.error === true )
{
res.statusCode = fileResEngine.statusCode;
res.end(fileResEngine.ErrorMsg);

return;
}

else
{
var UrlResLoader = new UrlLoader();
UrlResLoader.requestUrl(fileResEngine);
res.writeHead(UrlResLoader.httpcode, UrlResLoader.fileType);
res.write(UrlResLoader.data);
res.end();
}

}
catch(err)
{
res.statusCode = err.status || 500;
res.end(err.message);
}

}).listen(4000);

文件错误处理程序

var resolvePath = require('resolve-path');
const path = require('path');
var pagesDir = path.join(__dirname, 'Pages');



function pathCheckerEngine(path)
{
this.error = true;
this.path = path;
this.statusCode = 500;
this.ErrorMsg = "Internal Server Error";
this.PageRequest = "home.html";
this.extname = "html";
this.fullpath = './';
var pcEngine = this;
this.pathCheck = function()
{

try {
if (!path) {
pcEngine.statusCode = 400;
pcEngine.ErrorMsg = 'path required';
pcEngine.error = true;
}

else {

//removes first '/' of the path
pcEngine.PageRequest = path.substr(1);
pcEngine.fullpath = resolvePath(pagesDir, this.PageRequest);

pcEngine.statusCode = 200;
pcEngine.ErrorMsg = null;
pcEngine.error = false;
pcEngine.extname = this.PageRequest.split('.').pop();

}
}
catch(err)
{
pcEngine.statusCode = err.status || 500;
pcEngine.ErrorMsg = 'Malicious Page Request';
pcEngine.error = true;
}
}
}
module.exports = pathCheckerEngine;

最终文件

const fileEngine = require('./fileErrHandler');

const fs = require('fs');
const mime = require('mime');

function UrlController(fileResEngine) {
this.httpcode = null;
this.fileType = null;
this.data = null;
var urctrl = this;
this.requestUrl = function (fileResEngine) {


switch (fileResEngine.extname) {

case 'html':
fs.readFile(fileResEngine.fullpath, function (err, data) {
if (err)
{
console.log(err);
urctrl.httpcode = 404;
urctrl.data = "Page not found";
return;
}
urctrl.httpcode = 200;
urctrl.fileType = "'Content-Type': 'text/html'";
urctrl.data = data;

});

break;

case 'png':
case 'jpeg':
case 'jpg':
case 'bmp':
fs.readFile(fileResEngine.fullpath, function (err, data) {
if (err) {
console.log(err);
urctrl.httpcode = 404;
urctrl.data = "File not found";
return;
}
urctrl.httpcode = 200;
urctrl.fileType = mime.lookup(mime.lookup('./images' + req.url));
urctrl.data = data;

});

break;

default:
urctrl.httpcode = 404;
urctrl.data = "Page not Found"
break;

}
}

return;
}

module.exports = UrlController;

最佳答案

对于初学者来说,这是错误的:

var pathName = decodeURIComponent(parseUrl(req).pathname);

这可能就是为什么你后来的pathName是错误的。 req 是一个请求对象,它不是一个可以解析的 URL。 URL 路径位于该请求对象中。 req.url 将包含请求路径(没有域、端口和协议(protocol) - 只是路径)。

因此,将上面的行更改为:

var pathName = decodeURIComponent(req.url);

我不能保证该代码块中没有其他错误(我根本不知道 fileEngine 模块),但这至少是澄清的一件事影响您的 pathName 错误,这可能会导致您稍后在尝试使用 pathName 时出现错误。

<小时/>

现在您已经解决了这个问题,看来您还遇到了异步问题。您已经编写了 UrlController.requestUrl 代码,但没有编写任何方式来了解异步工作何时完成。它立即返回,然后稍后,其内部的 fs.readFile() 完成。因此,您最终会在对象的属性被设置之前就尝试使用它们。

您将需要使用 Promise 或回调来让调用者知道异步操作何时实际完成。我建议你阅读这篇canonical answer关于返回异步数据的主题。

关于javascript - 无法在javascript中调用null的方法 'toString'-nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46146722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com