我正在使用 API,它将作为我的项目架构中的数据访问层。
这是我的 API 查询设置的原始形式:
const pool = await poolPromise;
const request = pool.request();
const result = await request.input('user_id', sql.NVarChar(50), user_id || null)
.input('img_data', sql.VarBinary(sql.MAX), Buffer.from(img_data))
.input('img_size', sql.Decimal(10, 3), img_size)
.input('birthday', sql.Date, birthday)
.input('country', sql.VarChar(200), country)
.input('email_add', sql.NVarChar(150), email_add)
.input('mobile_no', sql.VarChar(50), mobile_no)
.input('key', sql.VarChar(100), key)
.query('EXEC testStoredProcedure @user_id, @img_data, @img_size, @birthday, @country, @email_add, @mobile_no, @key');
它与该设置配合良好。
但是,如果参数比预期的多,我想在保持相同结果的情况下提高 API 查询的可读性。
因此我使用变量和反引号来使用这些方法:
使用 req.body.[param]
const query = `
'EXEC testStoredProcedure
@user_id = ${req.body.user_id},
@img_data = ${req.body.img_data},
@img_size = ${req.body.img_size},
@birthday = ${req.body.birthday},
@country = ${req.body.country},
@email_add = ${req.body.email_add},
@mobile_no = ${req.body.mobile_no},
@key = ${req.body.key}'
`;
const pool = await poolPromise;
const request = pool.request();
const result = await request.input('user_id', sql.NVarChar(50), user_id || null)
.input('img_data', sql.VarBinary(sql.MAX), Buffer.from(img_data))
.input('img_size', sql.Decimal(10, 3), img_size)
.input('birthday', sql.Date, birthday)
.input('country', sql.VarChar(200), country)
.input('email_add', sql.NVarChar(150), email_add)
.input('mobile_no', sql.VarChar(50), mobile_no)
.input('key', sql.VarChar(100), key)
.query(query);
不带 req.body
const query = `
'EXEC testStoredProcedure
@user_id = ${user_id},
@img_data = ${img_data},
@img_size = ${img_size},
@birthday = ${birthday},
@country = ${country},
@email_add = ${email_add},
@mobile_no = ${mobile_no},
@key = ${key}'
`;
const pool = await poolPromise;
const request = pool.request();
const result = await request.input('user_id', sql.NVarChar(50), user_id || null)
.input('img_data', sql.VarBinary(sql.MAX), Buffer.from(img_data))
.input('img_size', sql.Decimal(10, 3), img_size)
.input('birthday', sql.Date, birthday)
.input('country', sql.VarChar(200), country)
.input('email_add', sql.NVarChar(150), email_add)
.input('mobile_no', sql.VarChar(50), mobile_no)
.input('key', sql.VarChar(100), key)
.query(query);
两者都无法通过我的 Flutter 项目中的此 API 调用来处理请求:
await _api.testMethod(
'/api/request', // route
null, // user_id
'', // img_data
0.00, // img_size
DateTime.now().toIso8601String(), // birthday
'Philippines', // country
null, // email_add
_mobileNo, // mobile_no
'SIGN_IN'); // key
这就是有req.body.[param]
和没有的req.body.[param]
日志内容:
未捕获的异常:异常:无法发出 POST 请求:异常:API 错误:500 {消息:'EXEC testStoredProcedure @user_id = null, @img_data = '', '.} 附近的语法不正确
根据日志,指定参数附近的语法EXEC testStoredProcedure
不正确。因此,我在这里遗漏了什么?
如果尝试的所有方法均无效,即使其中存在解决方法。
以下解决方案可以提高可读性并提供相同的结果:
替换此代码片段:
使用以下代码片段:
您会注意到
req.body
变量已被删除,并且我发现单引号(' )导致了语法不正确的异常。编辑:优化 API 控制器函数的结构
此代码片段引入了不适当的设置:
它应该被重构为:
删除查询变量因为它是多余的,并重构
.query(query)
并将其更改为.execute('testStoredProcedure')
。我希望它能对未来的读者有所帮助!;)