Yargsを使用して、コマンドラインからアクセスするメモを取るアプリを作成しています。新しいタイトルを入力すると、重複を避けるために、入力したようなタイトルが存在しないことを確認する必要があります。したがって、重複がない場合、内部には何もないため、理論的には!duplicateNote.length
と評価されます。
ただし、未定義のオブジェクトが原因で、アプリケーションが機能しなくなりました。そして、私はそれを理解することができません。すべてが正しく要求されています。
APP.JSファイル
yargs.command({
command: 'add',
describe: 'Add a new note',
builder: {
title: {
describe: 'Note title',
demandOption: true,
type: 'string'
},
body: {
describe: 'Note body',
demandOption: true,
type: 'string'
}
},
handler(argv) {
notes.addNote(argv.title, argv.body)
}
})
NOTES.JSファイル
const addNote = (title, body) => {
const notes = loadNotes()
const duplicateNote = notes.find((note) => note.title === title)
if (!duplicateNote.length) {
notes.Push({
title: title,
body: body
})
saveNotes(notes)
console.log(chalk.green.inverse('New note added!'))
} else {
console.log(chalk.bgRed('Note title taken!'))
}
}
const loadNotes= () => {
try {
const dataBuffer = fs.readFileSync('notes.json')
const dataJSON = dataBuffer.toString()
return JSON.parse(dataJSON)
} catch (e) {
return[]
}
}
module.exports = {
addNote: addNote,
removeNote: removeNote,
listNotes: listNotes,
readNote: readNote
}
「新しいメモが追加されました!」コンソールに記録されるが、代わりに:TypeError: Cannot read property 'length' of undefined
find
に何もない場合、undefined
を取得するためです。確認したい場合はfilter
を使用してください。
const duplicateNote = notes.filter((note) => note.title === title)
filter
は常に配列を提供します-find
はundefined
、または検出されたデータ型のいずれかを提供します。