feat: 完善后端启动,打二进制文件防止因为网络无法运行

This commit is contained in:
ethan.chen
2025-11-05 15:11:29 +08:00
parent 73945c40e5
commit fe64b293dd
5 changed files with 21 additions and 43 deletions

View File

@@ -7,6 +7,7 @@
}, },
"tasks": { "tasks": {
"start": "deno run --allow-net --allow-run --allow-read --allow-write --allow-env main.ts", "start": "deno run --allow-net --allow-run --allow-read --allow-write --allow-env main.ts",
"dev": "deno run --allow-net --allow-run --allow-read --allow-write --watch --allow-env main.ts" "dev": "deno run --allow-net --allow-run --allow-read --allow-write --watch --allow-env main.ts",
"build": "deno compile --target aarch64-apple-darwin --allow-net --allow-run --allow-read --allow-write --allow-env --output dist/ main.ts"
} }
} }

BIN
backend-deno/dist/backend-deno vendored Executable file

Binary file not shown.

View File

@@ -72,7 +72,7 @@ Deno.addSignalListener("SIGTERM", () => {
await startup(); await startup();
// 获取端口号 // 获取端口号
const port = parseInt(Deno.env.get("PORT") || "5005"); const port = Number(Deno.env.get("PORT") ?? 5005);
console.log(`启动后端服务器在端口: ${port}`); console.log(`启动后端服务器在端口: ${port}`);
// 启动服务器 // 启动服务器

View File

@@ -5,6 +5,9 @@
import { MusicStatus } from "./apple_music.ts"; import { MusicStatus } from "./apple_music.ts";
import { DatabaseSync } from 'node:sqlite' import { DatabaseSync } from 'node:sqlite'
const userDataDir = Deno.env.get("USER_DATA_DIR") ?? ".";
// 将 DB_PATH 设为 `${userDataDir}/lyrics.db`
const DB_PATH = `${userDataDir}/lyrics.db`;
export interface LyricsData { export interface LyricsData {
current_lyric_time: number | null; current_lyric_time: number | null;
@@ -37,7 +40,6 @@ let lyricsCache: LyricsCache = {
deleted: false, deleted: false,
}; };
const DB_PATH = "./lyrics.db";
const db = new DatabaseSync(DB_PATH); const db = new DatabaseSync(DB_PATH);
/** /**
@@ -80,12 +82,12 @@ export function clearLyricsCache(): void {
async function loadLyricsFromDB( async function loadLyricsFromDB(
trackName: string, trackName: string,
artist: string artist: string
): Promise<string | null> { ): Promise<string> {
try { try {
const content = db.prepare(`SELECT lyrics_text FROM lyrics WHERE track_name = ? AND artist = ?`).get(trackName, artist); const content = db.prepare(`SELECT lyrics_text FROM lyrics WHERE track_name = ? AND artist = ?`).get(trackName, artist);
return content.lyrics_text; return String(content?.lyrics_text ?? '');
} catch (error) { } catch (error) {
return null; return '';
} }
} }
@@ -101,8 +103,8 @@ export async function saveLyrics(
try { try {
db.prepare(`DELETE FROM lyrics WHERE track_name = ? AND artist = ?`).run(trackName, artist); db.prepare(`DELETE FROM lyrics WHERE track_name = ? AND artist = ?`).run(trackName, artist);
db.prepare(`INSERT INTO lyrics (track_name, artist, lyrics_text, source) VALUES (?, ?, ?, ?)`).run(trackName, artist, lyricsText, source); db.prepare(`INSERT INTO lyrics (track_name, artist, lyrics_text, source) VALUES (?, ?, ?, ?)`).run(trackName, artist, lyricsText, source);
lyricsCache.track_name = trackName; lyricsCache.track_name = trackName ?? null;
lyricsCache.artist = artist; lyricsCache.artist = artist ?? null;
lyricsCache.lyrics_text = lyricsText; lyricsCache.lyrics_text = lyricsText;
lyricsCache.source = source; lyricsCache.source = source;
console.log(`保存歌词成功: ${trackName} - ${artist}`); console.log(`保存歌词成功: ${trackName} - ${artist}`);
@@ -117,7 +119,7 @@ export async function saveLyrics(
export async function searchLyrics( export async function searchLyrics(
trackName: string, trackName: string,
artistName: string artistName: string
): Promise<string | null> { ): Promise<string> {
try { try {
const searchVariants = [ const searchVariants = [
{ title: trackName, artist: artistName }, { title: trackName, artist: artistName },
@@ -155,10 +157,10 @@ export async function searchLyrics(
} }
} }
return null; return '';
} catch (error) { } catch (error) {
console.error(`搜索歌词时出错: ${error}`); console.error(`搜索歌词时出错: ${error}`);
return null; return '';
} }
} }
@@ -283,8 +285,8 @@ export async function getLyricsData(status: MusicStatus): Promise<LyricsData> {
console.log(`歌曲切换,重新获取歌词: ${trackName} - ${artist}`); console.log(`歌曲切换,重新获取歌词: ${trackName} - ${artist}`);
// 清空缓存 // 清空缓存
lyricsCache.track_name = trackName; lyricsCache.track_name = trackName ?? null;
lyricsCache.artist = artist; lyricsCache.artist = artist ?? null;
lyricsCache.lyrics_text = null; lyricsCache.lyrics_text = null;
lyricsCache.deleted = false; lyricsCache.deleted = false;

View File

@@ -76,25 +76,15 @@ async function startDenoBackend(isDev) {
if (isDev) { if (isDev) {
// 开发模式使用项目中的Deno后端 // 开发模式使用项目中的Deno后端
scriptPath = path.join(__dirname, "..", "..", "backend-deno", "main.ts"); scriptPath = path.join(__dirname, "..", "..", "backend-deno", "dist", "backend-deno");
} else { } else {
// 生产模式使用打包的Deno后端 // 生产模式使用打包的Deno后端
scriptPath = path.join(process.resourcesPath, "backend-deno", "main.ts"); scriptPath = path.join(process.resourcesPath, "backend", "backend-deno");
} }
console.log(`启动Deno后端: ${scriptPath} 在端口 ${backendPort}`); console.log(`启动Deno后端: ${scriptPath} 在端口 ${backendPort}`);
console.log(`后端脚本路径存在: ${fs.existsSync(scriptPath)}`); console.log(`后端脚本路径存在: ${fs.existsSync(scriptPath)}`);
// 检查Deno是否安装
try {
const denoCheck = spawn("deno", ["--version"], { stdio: "pipe" });
denoCheck.on("error", (err) => {
throw new Error(`Deno未安装或不在PATH中: ${err.message}`);
});
} catch (err) {
throw new Error(`Deno未安装或不在PATH中: ${err.message}`);
}
// 打印Deno脚本目录内容 // 打印Deno脚本目录内容
try { try {
const scriptDir = path.dirname(scriptPath); const scriptDir = path.dirname(scriptPath);
@@ -104,29 +94,14 @@ async function startDenoBackend(isDev) {
} }
// 启动子进程 // 启动子进程
denoProcess = spawn( denoProcess = spawn(scriptPath,
"deno", [],
[
"run",
"--allow-net",
"--allow-run",
"--allow-read",
"--allow-write",
"--allow-env",
scriptPath,
],
{ {
env: { ...process.env, PORT: backendPort.toString() }, env: { ...process.env, PORT: backendPort.toString(), USER_DATA_DIR: require("electron").app.getPath("userData"), },
stdio: "pipe", // 确保可以读取标准输出和错误 stdio: "pipe", // 确保可以读取标准输出和错误
} }
); );
// 输出Deno进程的日志
denoProcess.stdout.on("data", (data) => {
const output = data.toString().trim();
console.log(`Deno后端输出: ${output}`);
});
denoProcess.stderr.on("data", (data) => { denoProcess.stderr.on("data", (data) => {
const message = data.toString().trim(); const message = data.toString().trim();
// 判断是否是错误日志还是普通日志 // 判断是否是错误日志还是普通日志