Я создаю электронное приложение, которое загружает изображения и сохраняет их теги в базе данных.В настоящее время я использую lokijs в базе данных памяти с loki-структурированным-файловым адаптером для сохранения.Тем не менее, я испытываю синие экраны смерти при использовании моего приложения.Я не знаю, почему происходят эти сбои.
Когда мой компьютер перезагружается после сбоя, последние два изображения, которые пыталось загрузить приложение, повреждены, как и мой файл loki.db.0.У меня нет способа диагностировать, загружает ли изображения или сохраняет базу данных, что приводит к сбою моего компьютера, но это, вероятно, одна из этих двух вещей.
Проводник Windows сообщает, что изображения имеют правильный размер файла.Я попробовал бесплатное программное обеспечение для восстановления файлов и преобразование расширения файла без успеха восстановления.Согласно программному обеспечению восстановления изображения пусты, и попытка открыть изображения в блокноте поддерживает это, поскольку мне возвращаются строки пустых символов вместо обычных закодированных символов.Сбои кажутся случайными, поскольку повторная загрузка этих изображений позже не приводит к тому же самому отказу.
Открытие json-файла loki.db.0 в Visual Studio Code возвращает поврежденную базу данных, которая выглядит примерно так:
...
{"url": "...", "files": [{"name": "1.jpeg", "width": 1280, "height": 1800}, {"name": "2.jpeg", "width": 1280, "height": 1800}], bytes: 1025050}
{"url": "...", "files": [{"name": "1.png", "width": 2048, "height": 2048}, {"name": "2.png", "width": 1300, "height": 1800 }], byte��������
�������������������������������������������������������������������������������������
�������������������������������������������������������������������������������������
...
Это код, который создает базу данных:
module.exports = class {
constructor() {
var database = this;
this.db;
this.downloads;
}
init() {
const loki = require('lokijs');
const lfsa = require('../node_modules/lokijs/src/loki-fs-structured-adapter.js');
return new Promise((resolve) => {
var adapter = new lfsa();
database.db = new loki(pathLocal + '/loki.db', {
adapter : adapter,
autoload: true,
autoloadCallback : database.createCollections,
autosave: true,
autosaveInterval: 10000
});
});
}
createCollections() {
database.downloads = database.db.getCollection('downloads');
if (database.downloads === null) {
database.downloads = database.db.addCollection('downloads');
}
}
}
Это код, который сохраняет изображения:
const request = require('request');
var progress = require('request-progress');
const mime = require('mime');
...
var entry = database.downloads.findOne({ '$loki': queuedId });
downloadImages(entry);
downloadImages(entry) {
if (entry.files == entry.length) return 'done';
var downloadPath = path.resolve(settings.download.downloadPath, entry.$loki.toString(), page.toString());
var req = request(getPage(entry));
downloadImage(entry, req, downloadPath).then((fileInfo) => {
entry.files.push(fileInfo);
entry.bytes += fileInfo.bytes;
database.downloads.update(entry);
// Download the next page
downloadImages(entry);
});
}
downloadImage(entry, req, filename) {
return new Promise((resolve, reject) => {
var dirname = path.dirname(filename);
if (!fs.existsSync(dirname)) fs.ensureDirSync(dirname);
var image;
var bytes;
progress(req, { delay: 0 }).on('progress', function (state) {
updateProgress(entry, state.speed);
})
.on('response', response => {
if (response.statusCode == 200) {
filename = filename + '.' + mime.getExtension(response.headers['content-type']);
image = fs.createWriteStream(filename);
bytes = response.headers['content-length'];
req.pipe(image);
} else {
reject(response.statusCode);
}
})
.on('error', function (error) {
reject(error);
})
.on('end', function () {
image.close();
try {
var input = require('fs').createReadStream(filename);
probe(input).then(result => {
input.destroy();
if (result != null) {
resolve({
'name': filename,
'bytes': bytes,
'width': result.width,
'height': result.height,
});
} else {
reject('not image or corrupt');
}
});
}
catch (error) {
reject(error);
}
});
});
}
Есть ли в этом коде что-нибудь, что могло быбыть причиной этих сбоев?Если нет, то есть ли способ зафиксировать ошибку до сбоя моего компьютера или просмотреть журнал ошибок после сбоя?Если нет, то есть ли альтернативы lokijs, которые могли бы работать лучше?
Редактировать: Я снова запустил свою программу и по неизвестной причине вместо синего экрана только программа потерпела крах.Вместо пустых файлов изображений, изображения были отключены во время загрузки, и файл loki.db.0 был полностью очищен.Вот созданный электронный журнал:
npm ERR! code ELIFECYCLE
npm ERR! errno 3221225477
npm ERR! electron-quick-start@1.0.0 start: `electron .`
npm ERR! Exit status 3221225477
npm ERR!
npm ERR! Failed at the electron-quick-start@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\*****\AppData\Roaming\npm-cache\_logs\2019-02-28T03_57_10_031Z-debug.log
И файл журнала:
0 info it worked if it ends with ok
1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe',
1 verbose cli 'C:\\Users\\*****\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js',
1 verbose cli 'start' ]
2 info using npm@6.4.1
3 info using node@v8.11.4
4 verbose run-script [ 'prestart', 'start', 'poststart' ]
5 info lifecycle electron-quick-start@1.0.0~prestart: electron-quick-start@1.0.0
6 info lifecycle electron-quick-start@1.0.0~start: electron-quick-start@1.0.0
7 verbose lifecycle electron-quick-start@1.0.0~start: unsafe-perm in lifecycle true
8 verbose lifecycle electron-quick-start@1.0.0~start: PATH: C:\Users\*****\AppData\Roaming\npm\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin;C:\Users\*****\Documents\My Projects\My Program\node_modules\.bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\nodejs\;C:\Program Files\Git\cmd;C:\Program Files\dotnet\;C:\Program Files\PuTTY\;C:\Ruby25-x64\bin;C:\Users\*****\AppData\Local\Microsoft\WindowsApps;;C:\Users\*****\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\*****\AppData\Roaming\npm;C:\Users\*****\.dotnet\tools
9 verbose lifecycle electron-quick-start@1.0.0~start: CWD: C:\Users\*****\Documents\My Projects\My Program
10 silly lifecycle electron-quick-start@1.0.0~start: Args: [ '/d /s /c', 'electron .' ]
11 silly lifecycle electron-quick-start@1.0.0~start: Returned: code: 3221225477 signal: null
12 info lifecycle electron-quick-start@1.0.0~start: Failed to exec start script
13 verbose stack Error: electron-quick-start@1.0.0 start: `electron .`
13 verbose stack Exit status 3221225477
13 verbose stack at EventEmitter.<anonymous> (C:\Users\*****\AppData\Roaming\npm\node_modules\npm\node_modules\npm-lifecycle\index.js:301:16)
13 verbose stack at emitTwo (events.js:126:13)
13 verbose stack at EventEmitter.emit (events.js:214:7)
13 verbose stack at ChildProcess.<anonymous> (C:\Users\*****\AppData\Roaming\npm\node_modules\npm\node_modules\npm-lifecycle\lib\spawn.js:55:14)
13 verbose stack at emitTwo (events.js:126:13)
13 verbose stack at ChildProcess.emit (events.js:214:7)
13 verbose stack at maybeClose (internal/child_process.js:925:16)
13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
14 verbose pkgid electron-quick-start@1.0.0
15 verbose cwd C:\Users\*****\Documents\My Projects\My Program
16 verbose Windows_NT 10.0.17134
17 verbose argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\*****\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js" "start"
18 verbose node v8.11.4
19 verbose npm v6.4.1
20 error code ELIFECYCLE
21 error errno 3221225477
22 error electron-quick-start@1.0.0 start: `electron .`
22 error Exit status 3221225477
23 error Failed at the electron-quick-start@1.0.0 start script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 3221225477, true ]
Может кто-нибудь объяснить, что означает этот журнал?
Редактировать 2: Я снова запустил программу и снова столкнулся с синим экраном.На этот раз, когда я перезагрузил и проверил файлы, были повреждены только два последних загруженных изображения, база данных осталась нетронутой.Это, вероятно, означает, что сбой вызван загрузкой изображений, а не сохранением базы данных (хотя все равно кажется, что повреждение базы данных все еще остается проблемой, если программа аварийно завершает работу или я неожиданно ее прекращаю).У кого-нибудь есть объяснения, почему моя программа может зависать или какие шаги я могу предпринять для дальнейшей отладки?Что я могу сделать, чтобы предотвратить повреждение базы данных при сбое программы?