có yêu cầu cho json trong node.js không


247

Tôi muốn bao gồm một vài tệp JSON trong mã JavaScript nằm trong cùng thư mục với tệp nguồn JavaScript của tôi.

Nếu tôi muốn bao gồm một tệp JavaScript khác, tôi chỉ có thể sử dụng require. Bây giờ tôi đang sử dụng readFileSync__dirnameđể lấy JSON, mà tôi nghĩ là một cách xấu để làm điều đó.

Có thứ gì tương tự để yêu cầu cho phép tôi tải tệp JSON không?


Xem câu hỏi tương tự này: stackoverflow.com/questions/4662851/ từ
Holygeek

@coen Ý bạn là gì khi "bao gồm một tệp JSON"? Đọc và phân tích nó? Nếu có, có thể trùng lặp: stackoverflow.com/questions/5726729/iêu
Ciro Santilli 冠状 病 六四

2
Đúng; đọc và phân tích Nhưng điều này đặc biệt là đọc một tệp , tương tự như đọc tệp js, vì vậy đây không phải là trùng lặp và câu trả lời của dê vẫn còn hiệu lực.
Coen

Câu trả lời:


454

Kể từ nút v0.5.x, bạn có thể yêu cầu JSON của mình giống như bạn yêu cầu tệp js.

var someObject = require('./somefile.json')

Trong ES6:

import someObject from ('./somefile.json')


1
Điều này có đúng không? Nó không hoạt động đối với tôi và github.com/joyent/node/issues/1357github.com/joyent/node/pull/584 đề nghị không nên.
dùng161642

12
Bạn cần sử dụng yêu cầu ('./ somefile.json') giả sử tệp nằm trong cùng thư mục (lưu ý dấu chấm và dấu gạch chéo).
Steve Willcock

66
Có một gotcha với điều này. Kết quả sẽ được lưu trữ! Vì vậy, nếu bạn vì lý do nào đó cần tải lại dữ liệu (giả sử tại một cronjob), bạn sẽ nhận được kết quả cũ tương tự.
Juho Vepsäläinen

41
Lưu ý: tiện ích mở rộng .jsondường như có vấn đề
nha

9
json hình thành tốt cũng giúp
sdeburca

40

Các tệp JSON không yêu cầu một tuyên bố xuất khẩu rõ ràng. Bạn không cần xuất để sử dụng nó dưới dạng tệp Javascript.

Vì vậy, bạn có thể sử dụng chỉ requirecho tài liệu JSON hợp lệ.

data.json

{
  "name": "Freddie Mercury"
}

main.js

var obj = require('data.json');

console.log(obj.name); 
//Freddie Mercury

20

Không. Sử dụng readFilehoặc readFileSync(Chỉ sau khi khởi động).

Hoặc sử dụng một thư viện hiện có như

Hoặc viết cấu hình của bạn trong tệp js thay vì tệp json như

module.exports = {
  // json
}

1
@coen có, chúng tôi luôn sử dụng __dirnameđể tạo đường dẫn tương đối.
Raynos

Chạy vào đây, nơi nó sẽ nhập JSON cục bộ nhưng không có trong bộ chứa docker trên phiên bản EC2 của tôi trong AWS ... Thay vì cố gắng định cấu hình các loại mime và không, tôi chỉ chuyển sang JS thay vì JSON. Hy vọng điều này có thể giúp một ai đó.
Erik Grosskurth

17

Hai trong số phổ biến nhất

Cách thứ nhất:

let jsonData = require('./JsonFile.json')

let jsonData = require('./JsonFile') // nếu chúng ta bỏ qua .json cũng hoạt động

HOẶC LÀ

import jsonData from ('./JsonFile.json')

Cách thứ hai:

1) đồng bộ

const fs = require('fs')
let jsonData = JSON.parse(fs.readFileSync('JsonFile.json', 'utf-8'))

2) không đồng bộ

const fs = require('fs')
let jsonData = {}
fs.readFile('JsonFile.json', 'utf-8', (err, data) => {
  if (err) throw err

  jsonData = JSON.parse(data)
})

Lưu ý: 1) nếu chúng tôi thay đổi JsonFile.json, chúng tôi sẽ không nhận được dữ liệu mới, ngay cả khi chúng tôi chạy lại yêu cầu ('./ JsonFile.json')

2) fs.readFile hoặc fs.readFileSync sẽ luôn đọc lại tệp và nhận các thay đổi


Lưu ý rằng phương thức fs sử dụng thư mục nơi nút được khởi chạy từ điểm bắt đầu, không phải thư mục nơi mã nguồn thực hiện đọc, trong khi phương thức "yêu cầu" sử dụng đường dẫn liên quan đến vị trí nhập mã nguồn. Vì vậy, bạn sẽ có sự khác biệt về đường dẫn giữa hai phương thức ngay khi bạn lưu trữ mọi thứ trong các thư mục khác nhau.
Will59

3

Bạn thậm chí có thể sử dụng yêu cầu JSON của mình mà không chỉ định phần mở rộng .json . Nó sẽ cho phép bạn thay đổi phần mở rộng tệp thành .js mà không có bất kỳ thay đổi nào trong quá trình nhập của bạn.

giả sử chúng ta có ./myJsonFile.json trong cùng thư mục.

const data = require('./myJsonFile')

Nếu trong tương lai bạn sẽ thay đổi ./myJsonFile.json thành ./myJsonFile.js không có gì phải thay đổi trong quá trình nhập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.