node-webkit中数据库升级机制

本文介绍了一个用于自动升级SQLite数据库的Node.js模块。该模块通过检查数据库版本并执行相应的SQL脚本来实现升级。提供了完整的源代码及说明。

写了个模块,本模块中应用了sqllite3数据库,升级原理是检查数据库的version版本表中版本值,把版本值加一之后去读取对应的sql文件,执行sql语句,然后依次循环说取下一个文件直到完成。

模块中所有sql文件放在/sql/文件夹下,如:contact_create.sql,contact_update_1.sql,contact_update_2.sql,等等,使用时执行 updateUserDB()方法就行。

var _=require("underscore");
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs');
var async = require("async");
var path=require("path");

EnvironmentDAO = function(){
var DB={},dbNames=["contact","groups","message"];//for example 
//初始化
var init = function(){
    _.each(dbNames,function(name){
	DB[name]=new sqlite3.Database(path.join("/main/db",name+'.db'), sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE)
    });
};
init();
// 检查数据库是否为空
this.checkDB = function(db,callback){			
	db.get("SELECT count(*) as exist FROM sqlite_master WHERE type='table' AND name='version'",function(err,result){
		if(err){
			console.error("checkDB error",err);
			callback(null,false);
		}else{
			if(result.exist == 1){
				callback(null,true);
			}else{
				callback(null,false);
			}
		}					
	});					
};	
// 通用初始化数据库
this.initDbCommon = function(db,dbName,callback){
	var self=this;
	var sql = fs.readFileSync('/sql/'+dbName+"_create.sql", 'utf8');			
	db.exec(sql,function(err,result){
		if(err){
			console.error("create DB error",dbName,err)
		}
		callback&&callback(err,result)
	});
};
// 通用获取数据库版本
this.getDbVersionCommon = function(db,callback){			
	db.get("SELECT version from version where key = 'db_version'",function(err,result){
		if(err){
			console.error("getDbVersion err",err);
		}
		callback&&callback(err,result);
	})				
};		
// 通用升级数据库
this.updateDbCommon = function(db,dbName,callback){  			
	var self = this;
	var doUpdate = function(cb){
		self.getDbVersionCommon(db,function(err,dbv){
			if(err||!dbv){
				console.error("getDbVersion err ",dbName,dbv,err);
				//没有表或表名错误时重新创建表--容错机制
				if(err.code == "SQLITE_ERROR"){
					self.initDbCommon(db,dbName,function(err){
					if(!err){
						self.updateDbCommon(db,dbName,function(err){
	        				if(err){
	        					console.error("second time Init and UPdate DB error",dbName,err);
	        				}
	        				cb(true);				        				
	        			});
					}	
	    			})
				}else{
				//其它错误忽略
					cb(false)
				}						
			}else{
				var v = dbv.version;
				v++;
	        	if(fs.existsSync('/sql/'+dbName+"_update_"+v+'.sql')){
					var sql = fs.readFileSync('/sql/'+dbName+"_update_"+v+'.sql', 'utf8');
	    			db.exec(sql,function(err){
	    				if(err){
	    					console.error("updateDbCommon err:",dbName,sql,err);
	    					cb(false);
	    				}else{
	    					cb(true);
	    				}
	    			});
	        	}else{
	        		cb(false);
	        	}
			}					
		});
	}
	doUpdate(function(tryAgain){
		if(tryAgain){
			doUpdate.apply(this,[arguments.callee]);
		}else{
			if(typeof callback =="function") callback();
		}
	});			
};
// 升级所有用户数据库
this.updateUserDB=function(callback){			
	var self = this;
	async.forEach(
	  dbNames, 
	  function(dbname,cb){
	  	self.checkDB(DB[dbname],function(err,isExist){
	  		if(isExist){
	        		self.updateDbCommon(DB[dbname],dbname,cb);
	    		}else{
	    			self.initDbCommon(DB[dbname],dbname,function(){
	        			self.updateDbCommon(DB[dbname],dbname,cb);
	    			})
	    		}
	  	})
	  }, 
	  function(err){
	    if(err){
	      logger.error("updateUserDB Error:",err);
	    }
      	if(typeof callback =="function") {
			callback(err);	
		}
	  }
	);
};
}

exports = module.exports = new EnvironmentDAO();


转载于:https://my.oschina.net/u/265765/blog/358859

F:\vue3new\Ch-08\shop-backend>npm start > shop-backend@1.0.0 start > node development.js [2025-06-01T12:06:07.254] [34872] [INFO] - Server running at http://127.0.0.1:8360 [2025-06-01T12:07:45.601] [34872] [INFO] - ThinkJS version: 3.2.15 [2025-06-01T12:07:45.602] [34872] [INFO] - Environment: development [2025-06-01T12:07:45.602] [34872] [INFO] - Workers: 1 [2025-06-01T12:07:57.318] [30344] [INFO] - mysql://root:123456@127.0.0.1:3306/vueshop Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:07:57.335] [30344] [INFO] - GET / 500 680ms [2025-06-01T12:07:57.533] [30344] [INFO] - GET /favicon.ico 404 2ms Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:08:21.584] [30344] [INFO] - GET / 500 12ms Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:08:22.177] [30344] [INFO] - GET / 500 11ms Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:12:46.861] [30344] [INFO] - GET / 500 7ms Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:12:47.470] [30344] [INFO] - GET / 500 9ms
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值