javascript-Node.js:从请求获取路径

我有一个名为“ localhost:3000 / returnStat”的服务,该服务应将文件路径作为参数。 例如“ /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);
});
};
Nabil Djarallah asked 2020-01-13T05:32:05Z
6个解决方案
56 votes
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/]

Gaurav answered 2020-01-13T05:32:48Z
9 votes

只需致电req.url即可。 你会得到像/something?bla=foo这样的东西

Sagiv Ofek answered 2020-01-13T05:33:08Z
5 votes

您可以在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);
kumbhani bhavesh answered 2020-01-13T05:33:28Z
4 votes
req.protocol + '://' + req.get('host') + req.originalUrl

要么

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

Xin answered 2020-01-13T05:33:52Z
2 votes

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

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

返回带有路径的数组。

Ideabile answered 2020-01-13T05:34:17Z
-1 votes

在使用明确请求时结合以上解决方案:

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', '', '' ]
loretoparisi answered 2020-01-13T05:34:45Z
translate from https://stackoverflow.com:/questions/18931452/node-js-get-path-from-the-request