Node.js'de bir dosya okuyun


187

Node.js'deki dosyaları okuma konusunda oldukça şaşkınım.

fs.open('./start.html', 'r', function(err, fileToRead){
    if (!err){
        fs.readFile(fileToRead, {encoding: 'utf-8'}, function(err,data){
            if (!err){
            console.log('received data: ' + data);
            response.writeHead(200, {'Content-Type': 'text/html'});
            response.write(data);
            response.end();
            }else{
                console.log(err);
            }
        });
    }else{
        console.log(err);
    }
});

Dosya start.html , açmaya ve okumaya çalışan dosyayla aynı dizinde.

Ancak, konsolda:

{[Hata: ENOENT, './start.html'] errno: 34, kod: 'ENOENT', yol: './start.html'}

Herhangi bir fikir?


8
Muhtemelen dosya sizin / kodun düşündüğü yerde değildir. Dosya komut dosyasıyla aynı path.join(__dirname, 'start.html')
dizindeyse

1
Console.log ("__ dirname:" + __dirname); hata çıkmadan hemen önce? Bu, o anda yürütülebilir dosyanız için hangi dizinin yerel olduğunu söyleyecektir. Konumunuzu değiştirmek için yapabileceğiniz şeyler vardır ve belki de buna isabet edersiniz, belki kod, düşündüğünüz __dirname adresinde çalışmaz.
Brian

Dosyanın, düğüm işlemini çalıştırdığınız dizinde olması gerekir. Dosya dir / node / index.html içindeyse ve app.js dosyanız varsa, ancak şunu yapın: node /dir/node/app.js Sonra bir hata alırsınız. dc5'in çözümü hile yapmalı.
Evan Shortiss

Bu soruyu kapatmalı veya düzenlemenizi yanıt olarak vermeli ve kabul etmelisiniz.
ChrisCM

kullanın path.join(__dirname, '/filename.html')ve referans almak için stackoverflow.com/a/56110874/4701635
Paresh Barad

Yanıtlar:


238

Kullanın path.join(__dirname, '/start.html');

var fs = require('fs'),
    path = require('path'),    
    filePath = path.join(__dirname, 'start.html');

fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
    if (!err) {
        console.log('received data: ' + data);
        response.writeHead(200, {'Content-Type': 'text/html'});
        response.write(data);
        response.end();
    } else {
        console.log(err);
    }
});

DC5 sayesinde.


14
@AramKocharyan Async kodunda asla * Sync işlevlerini kullanmayın. Bu, dosya okunana kadar tüm uygulamayı kilitler. * Senkronizasyon fonksiyonları, örneğin modül sisteminde uygulama başlangıcında kullanılmak üzere tasarlanmıştır.
Eugene Kostrikov

3
Evet benim durumumda bu çok zor bir işti.
Aram Kocharyan

2
Kod örneğinizde bir yazım hatası var path.join, işe yaramaz, ,yerine kullanın+
Yves M.

Bu kod benim için çalışmıyor gibi görünüyor, hala aynı hatayı alıyorum
aiden87

Neden sadece düz bir sicim yolu kullanarak çalışmıyor ../someFolder/myFile.txt?
Miguel Péres

42

Düğüm 0.12 ile, bunu şimdi eşzamanlı olarak yapmak mümkündür:

  var fs = require('fs');
  var path = require('path');

  // Buffer mydata
  var BUFFER = bufferFile('../public/mydata.png');

  function bufferFile(relPath) {
    return fs.readFileSync(path.join(__dirname, relPath)); // zzzz....
  }

fsdosya sistemidir. readFileSync () , bir Arabellek veya sorarsanız dize döndürür.

fsdoğru göreceli yolların bir güvenlik sorunu olduğunu varsayar. pathbir çözümdür.

Dize olarak yüklemek için kodlamayı belirtin:

return fs.readFileSync(path,{ encoding: 'utf8' });

5
*SyncWeb için programlama yaparken herhangi bir yöntem kullanmayın . Bunlar sadece homurdanma / yutkunma görevleri, konsol uygulamaları vb. İçin uygundur. Okuma sırasında tüm süreci duraklatırlar. OP kodu responseaçıkça readFileSyncuygun olmayan bir web uygulamasıdır .
Samuel Neff

3
Başka kullanım durumları olup olmadığına bakılmaksızın (ve başlangıçta bir önbelleğe dosya yüklemek kesinlikle bunlardan biri değildir), OP'nin gönderisi kesinlikle kullanmak istediğiniz bir durum değildir - readFileSyncişlemenin ortasında bir web isteği. Bu cevap eldeki soru için tamamen uygunsuzdu.
Samuel Neff

28

1). ASync için:

var fs = require('fs');
fs.readFile(process.cwd()+"\\text.txt", function(err,data)
            {
                if(err)
                    console.log(err)
                else
                    console.log(data.toString());
            });

2) .Senkronizasyon için:

var fs = require('fs');
var path = process.cwd();
var buffer = fs.readFileSync(path + "\\text.txt");
console.log(buffer.toString());

3
process.cwd () yerine __dirname değişkenini kullanabileceğinizi düşünüyorum
Ishikawa Yoshi

2
@IshikawaYoshi process.cwd()geçerli çalışma dizinidir ve __dirnamegeçerli modülün dizinidir, bu yüzden aynı değildirler.
A1rPun

13

düğüm ile basit senkron yol:

let fs = require('fs')

let filename = "your-file.something"

let content = fs.readFileSync(process.cwd() + "/" + filename).toString()

console.log(content)

9

Bu kodu çalıştırın, dosyadan veri alır ve konsolda görüntülenir

function fileread(filename)
{            
   var contents= fs.readFileSync(filename);
   return contents;
}        
var fs =require("fs");  // file system        
var data= fileread("abc.txt");
//module.exports.say =say;
//data.say();
console.log(data.toString());

5

httpModülü kullanarak html dosyasını sunucudan okumak için . Bu dosyayı sunucudan okumanın bir yoludur. Konsolda almak istiyorsanız sadece httpmodül bildirimini kaldırın .

var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req, res) {
  fs.readFile('HTMLPage1.html', function(err, data) {
    if (!err) {
      res.writeHead(200, {
        'Content-Type': 'text/html'
      });
      res.write(data);
      res.end();
    } else {
      console.log('error');
    }
  });
});
server.listen(8000, function(req, res) {
  console.log('server listening to localhost 8000');
});
<html>

<body>
  <h1>My Header</h1>
  <p>My paragraph.</p>
</body>

</html>


Yukarıdaki kod sunucudaki html dosyasını okumaktır. "Http" modülünü kullanarak sunucu oluşturarak sunucudaki html dosyasını okuyabilirsiniz. Sunucudaki yanıt dosyasına giden yol budur. Konsoldan almak için "http" modülünü de kaldırabilirsiniz
Aaditya

1
Merhaba, yorumunuzu düzenle düğmesine tıklayarak cevaba eklemek isteyebilirsiniz.
Glenn Watson

3

Bir dizinde bir dosyayı nasıl okuyacağınızı bilmek ve onunla bir şeyler yapmak istiyorsanız, işte başlıyoruz. Bu aynı zamanda bir komutun nasıl çalıştırılacağını da gösterir power shell. Bu içeride TypeScript! Bu konuda sorun yaşadım, umarım bu bir gün birine yardım eder. Bu yararsız olduğunu düşünüyorsanız bana aşağı oy çekinmeyin. Bunun webpackbenim .tsiçin yaptığı, konuşlandırmaya hazırlanmak için belirli bir klasördeki dizinlerimin her birinde bulunan tüm dosyalarımdı. Kullanmak için koyabilirsiniz umuyoruz!

import * as fs from 'fs';
let path = require('path');
let pathDir = '/path/to/myFolder';
const execSync = require('child_process').execSync;

let readInsideSrc = (error: any, files: any, fromPath: any) => {
    if (error) {
        console.error('Could not list the directory.', error);
        process.exit(1);
    }

    files.forEach((file: any, index: any) => {
        if (file.endsWith('.ts')) {
            //set the path and read the webpack.config.js file as text, replace path
            let config = fs.readFileSync('myFile.js', 'utf8');
            let fileName = file.replace('.ts', '');
            let replacedConfig = config.replace(/__placeholder/g, fileName);

            //write the changes to the file
            fs.writeFileSync('myFile.js', replacedConfig);

            //run the commands wanted
            const output = execSync('npm run scriptName', { encoding: 'utf-8' });
            console.log('OUTPUT:\n', output);

            //rewrite the original file back
            fs.writeFileSync('myFile.js', config);
        }
    });
};

// loop through all files in 'path'
let passToTest = (error: any, files: any) => {
    if (error) {
        console.error('Could not list the directory.', error);
        process.exit(1);
    }

    files.forEach(function (file: any, index: any) {
        let fromPath = path.join(pathDir, file);
        fs.stat(fromPath, function (error2: any, stat: any) {
            if (error2) {
                console.error('Error stating file.', error2);
                return;
            }

            if (stat.isDirectory()) {
                fs.readdir(fromPath, (error3: any, files1: any) => {
                    readInsideSrc(error3, files1, fromPath);
                });
            } else if (stat.isFile()) {
                //do nothing yet
            }

        });
    });
};

//run the bootstrap
fs.readdir(pathDir, passToTest);

2
var fs = require('fs');
var path = require('path');

exports.testDir = path.dirname(__filename);
exports.fixturesDir = path.join(exports.testDir, 'fixtures');
exports.libDir = path.join(exports.testDir, '../lib');
exports.tmpDir = path.join(exports.testDir, 'tmp');
exports.PORT = +process.env.NODE_COMMON_PORT || 12346;

// Read File
fs.readFile(exports.tmpDir+'/start.html', 'utf-8', function(err, content) {
  if (err) {
    got_error = true;
  } else {
    console.log('cat returned some content: ' + content);
    console.log('this shouldn\'t happen as the file doesn\'t exist...');
    //assert.equal(true, false);
  }
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.