Step 3: Debugging code trên Cloudpage
Một trong những lỗi đáng sợ nhất mà các MC developer gặp phải chính là lỗi “500 internal server error” bởi đoạn mã của chúng ta như thế nào đó lại bị crash khi chạy. Ở bài này Gâu Đần sẽ đi qua lỗi này và cách xử lý khi gặp.
Try Catch statement
Chẳng hạn ta có dữ liệu sau thuộc DE “Duplicate_DE”:
id | name | phone | address | remark | appt_date | |
1 | duc | du*@gm***.com | 123456789 | street A | dup | 14/2/2022 12:00:00 AM |
2 | vu | du*@gm***.com | 123456789 | street B | dup | 14/2/2022 12:00:00 AM |
3 | phap | ph**@gm***.com | 123123123 | street C | dup | 14/2/2022 12:00:00 AM |
4 | thu | ph**@gm***.com | 123321321 | street D | dup | 14/2/2022 12:00:00 AM |
5 | khanh | kh***@gm***.com | 44442222 | street E | dup | 14/2/2022 12:00:00 AM |
Ta có đoạn code sau để show dữ liệu lên trang Cloudpage như ở Step 2 thuộc bài trước:
<script runat="server">
Platform.Load("core", "1.1.1");
var DEname, data;
try{
DEname = "Duplicate_DE";
data = Platform.Function.LookupRows(DEname, 'remark', 'dup');
if(data.length > 0) {
for(var i = 0; i <data.length; i++) {
Write("id: " + data[i].id + "<br>");
Write("name: " + data[i].name + "<br>");
Write("email: " + data[i].email + "<br>");
Write("phone: " + data[i].phone + "<br>");
Write("address: " + data[i].address + "<br>");
Write("date: " + formatDate(data[i].appt_date) + "<br><br>");
}
}
} catch (ex) {
Write('Error happened: ' + Stringify(ex));
};
function formatDate(date) {
var d = new Date(date),
month = '' + (d.getMonth() + 1),
day = '' + d.getDate(),
year = d.getFullYear();
if (month.length < 2)
month = '0' + month;
if (day.length < 2)
day = '0' + day;
var formattedDate = day + '/' + month + '/' + year;
return formattedDate
}
</script>
Output:
Trong đó ở line 4 và 18-20 Gâu Đần đã sử dụng Try Catch statement để Debug đoạn code ở giữa.Bây giờ vẫn đoạn code trên, thử đổi lại đoạn ở line 6 thành thế này:
data = Platform.Function.LookupRows(DEname, 'RandomColumn', 'dup');
Refresh lại Cloudpage của bạn.
Nó sẽ báo lỗi cái Field mà chúng ta đang tìm không tồn tại trong Data Extension này. Từ đó ta có thể biết được ta đang Look sai Field.
Cũng đoạn code sai Field đó, nếu không có Try Catch thì đơn thuần nó chỉ trả về lỗi “500 internal server error” mà ta không thể nào biết được ta đang sai ở đâu.
Để Debug trong AMPscript thì ta bọc block code đó lại trong block try catch của SSJS như thế này:
<script runat="server">
try{
</script>
%%[Your AMPscript goes here]%%
<script runat="server">
} catch (ex) {
Write('Error happened: ' + Stringify(ex));
};
</script>
Không may rằng, không phải lúc nào cách này cũng phản hồi lỗi cho ta biết. Tức là dù có Try Catch nhưng lỗi này là không thể tránh khỏi, chẳng hạn ghi sai Function, thiếu parameter trong hàm, sai syntax… thì nó vẫn báo lỗi 500…
- Lúc này ta chỉ có thể đi từ đầu đến cuối và “Print” các Variable xem thử code đã chạy được tới đâu từ đó tìm vị trí lỗi.
- Với một đoạn code dài thì có thể comment out
/* comment out */
1 nửa đoạn code xem có chạy không, rồi cứ làm như vậy cho đến khi ta biết lỗi đang nằm ở vị trí nào. - Kiểm tra syntax của AMPscript thì xem có lỗi chỗ nào không thì vào thử trang này https://ampscript.io/. Nó khá hữu ích dù đôi lúc không chính xác 100%.
- Muốn kiểm tra syntax khi viết bằng SSJS thì có thể đổi detect language trong VS code ở file code thành JavaScript và comment out tag <script> để kiểm tra.
Một lưu ý nhỏ: khi dùng Try Catch statement. Đó block Try Catch là sẽ được một scope riêng lẻ, vì thế biến được khai báo trong block này sẽ không thể truy cập được từ bên ngoài.
<script runat="server">
Platform.Load("core", "1.1.1");
try {
var num = 4;
} catch (ex) {
Write(Stringify(ex));
}
Write(num);
</script>
Output: undefined
Cách khắc phục là khai báo biến bên ngoài Try Catch
<script runat="server">
Platform.Load("core", "1.1.1");
var num;
try {
num = 4;
} catch (ex) {
Write(Stringify(ex));
}
Write(num);
</script>
Output: 4