Js: 从请求获取路径

我有一个名为“ localhost: 3000/returStat”的服务,它应该将文件路径作为参数,例如’/BackupFolder/toto/tata/titi/myfile.txt’。

如何在浏览器上测试此服务? 例如,如何使用 Express 格式化此请求?

exports.returnStat = function(req, res) {


var fs = require('fs');
var neededstats = [];
var p = __dirname + '/' + req.params.filepath;


fs.stat(p, function(err, stats) {
if (err) {
throw err;
}
neededstats.push(stats.mtime);
neededstats.push(stats.size);
res.send(neededstats);
});
};
212879 次浏览
var http = require('http');
var url  = require('url');
var fs   = require('fs');


var neededstats = [];


http.createServer(function(req, res) {
if (req.url == '/index.html' || req.url == '/') {
fs.readFile('./index.html', function(err, data) {
res.end(data);
});
} else {
var p = __dirname + '/' + req.params.filepath;
fs.stat(p, function(err, stats) {
if (err) {
throw err;
}
neededstats.push(stats.mtime);
neededstats.push(stats.size);
res.send(neededstats);
});
}
}).listen(8080, '0.0.0.0');
console.log('Server running.');

我还没有测试你的代码,但其他的工作

如果你想从请求网址获得路径信息

 var url_parts = url.parse(req.url);
console.log(url_parts);
console.log(url_parts.pathname);

1.如果你得到的 URL 参数仍然无法读取的文件只是正确的文件路径在我的例子。如果您将 index.html 放在与服务器代码相同的目录中,那么..。

2.如果你有大的文件夹结构,你想主机使用节点,那么我会建议你使用一些框架,如 Expressjs

如果需要原始解决方案到文件路径

var http = require("http");
var url = require("url");


function start() {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}


http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}


exports.start = start;

来源: http://www.nodebeginner.org/

只要调用 req.url。这应该做的工作。你会得到像 /something?bla=foo

您可以在 app.js文件中使用它。

var apiurl = express.Router();
apiurl.use(function(req, res, next) {
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
next();
});
app.use('/', apiurl);

基于@epegzz 对正则表达式的建议。

( url ) => {
return url.match('^[^?]*')[0].split('/').slice(1)
}

返回一个包含路径的数组。

req.protocol + '://' + req.get('host') + req.originalUrl

或者

req.protocol + '://' + req.headers.host + req.originalUrl//我喜欢这个,因为它从代理服务器存活下来,获得了原始的主机名

在使用快速请求时结合上述解决方案:

let url=url.parse(req.originalUrl);
let page = url.parse(uri).path?url.parse(uri).path.match('^[^?]*')[0].split('/').slice(1)[0] : '';

这个可以处理所有类似

localhost/page
localhost:3000/page/
/page?item_id=1
localhost:3000/
localhost/

例如:

> urls
[ 'http://localhost/page',
'http://localhost:3000/page/',
'http://localhost/page?item_id=1',
'http://localhost/',
'http://localhost:3000/',
'http://localhost/',
'http://localhost:3000/page#item_id=2',
'http://localhost:3000/page?item_id=2#3',
'http://localhost',
'http://localhost:3000' ]
> urls.map(uri => url.parse(uri).path?url.parse(uri).path.match('^[^?]*')[0].split('/').slice(1)[0] : '' )
[ 'page', 'page', 'page', '', '', '', 'page', 'page', '', '' ]

使用 URL WebAPI 的更现代的解决方案:

(req, res) => {
const { pathname } = new URL(req.url || '', `https://${req.headers.host}`)
}

我用过这个 const { pathname } = req?._parsedUrl || {};,它对我很有用